執行個體公開方法
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
方法無法在範圍區塊(例如 namespace
或 scope
)中使用,若偵測到會引發錯誤。
resolve(*args, &block) 連結
定義自訂型多型對應,從模型到 URL。會改變 polymorphic_url
的行為,接下來是 link_to
、form_with
與 form_for
傳遞模型執行個體時的行為,例如:
resource :basket
resolve "Basket" do
[:basket]
end
現在傳遞 Basket
執行個體至 link_to
、form_with
或 form_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
方法無法在範圍區塊(例如 namespace
或 scope
)中使用,若偵測到會引發錯誤。
# 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