实例公有方法
direct(name, options = {}, &block) 链接
定义自定义 URL 帮助器,这些帮助器将添加到应用程序的路由中。这允许你覆盖和/或替换路由帮助器的默认行为,例如
direct :homepage do
"https://rubyonrails.net.cn"
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
等作用域块内使用,如果检测到它,它将引发错误。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2158 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_to
和 form_for
在传递模型实例时的行为,例如
resource :basket
resolve "Basket" do
[:basket]
end
当 Basket
实例传递给 link_to
或 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”,但第二个将生成 “/admin/users/1” 的标准多态 URL。
您可以将选项传递给多态映射 - 块的元数需要为两个,因为实例作为第一个参数传递,例如
resolve "Basket", anchor: "items" do |basket, options|
[:basket, options]
end
这会生成 URL “/basket#items”,因为当传递给 polymorphic_url
的数组中的最后一个项目是哈希时,它会被视为被调用的 URL 帮助器的选项。
注意:resolve
方法不能在 namespace
或 scope
等作用域块内使用,并且如果检测到它,它将引发错误。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2210 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