跳至內容 跳至搜尋
方法
D
R

執行個體公開方法

direct(name, options = {}, &block)

定義客製化 URL 輔助工具,這些工具會新增至應用程式的路由。這麼做可以讓您覆寫和/或取代路由輔助工具的預設行為,例如:

direct :homepage do
  "https://rubyonrails.org"
end

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :main do
  { controller: "pages", action: "index", subdomain: "www" }
end

傳遞給 direct 的區塊回傳值必須是 url_for 的一組有效引數,實際上能夠建立 URL 字串。以下列出可能的內容:

  • 視為已產生 URL 的字串

  • 散列表,例如 { controller: "pages", action: "index" }

  • 陣列,傳遞給 polymorphic_url

  • Active Model 執行個體

  • Active Model 類別

注意:區塊中可呼叫其他 URL 輔助工具,但請小心不要再次呼叫客製化 URL 輔助工具,否則會發生堆疊溢位錯誤。

您也可以指定預設選項,傳遞至 URL 輔助工具定義,例如:

direct :browse, page: 1, size: 10 do |options|
  [ :products, options.merge(params.permit(:page, :size).to_h.symbolize_keys) ]
end

在此執行個體中,params 物件來自執行區塊的環境,例如:在控制器動作或檢視中產生 URL。若執行區塊的執行位置沒有 params 物件,如下所示:

Rails.application.routes.url_helpers.browse_path

會引發 NameError。因此,當定義客製化 URL 輔助工具時,您需要知道將在何種環境中使用它。

注意:direct 方法無法在範圍區塊(例如 namespacescope)中使用,若偵測到會引發錯誤。

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2223
def direct(name, options = {}, &block)
  unless @scope.root?
    raise RuntimeError, "The direct method can't be used inside a routes scope block"
  end

  @set.add_url_helper(name, options, &block)
end

resolve(*args, &block)

定義自訂型多型對應,從模型到 URL。會改變 polymorphic_url 的行為,接下來是 link_toform_withform_for 傳遞模型執行個體時的行為,例如:

resource :basket

resolve "Basket" do
  [:basket]
end

現在傳遞 Basket 執行個體至 link_toform_withform_for 時會產生“/basket”,而非標準的“/baskets/:id”。

注意:此自訂行為僅適用於傳遞單一模型執行個體的簡單多型 URL,而不適用於比較複雜的形式,例如:

# config/routes.rb
resource :profile
namespace :admin do
  resources :users
end

resolve("User") { [:profile] }

# app/views/application/_menu.html.erb
link_to "Profile", @current_user
link_to "Profile", [:admin, @current_user]

第一個 link_to 會產生“/profile”,而第二個會產生標準多型 URL“/admin/users/1”。

您可以傳遞選項至多型對應中 - 區塊的定義範圍需要是 2,因為執行個體被傳遞為第一個引數,例如:

resolve "Basket", anchor: "items" do |basket, options|
  [:basket, options]
end

這麼做會產生 URL“/basket#items”,因為傳遞給 polymorphic_url 的陣列中最後一個項目是散列表時,會將其視為所呼叫 URL 輔助工具的選項。

注意:resolve 方法無法在範圍區塊(例如 namespacescope)中使用,若偵測到會引發錯誤。

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2275
def resolve(*args, &block)
  unless @scope.root?
    raise RuntimeError, "The resolve method can't be used inside a routes scope block"
  end

  options = args.extract_options!
  args = args.flatten(1)

  args.each do |klass|
    @set.add_polymorphic_mapping(klass, options, &block)
  end
end