跳至内容 跳至搜索
方法
D
R

实例公共方法

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方法不能在诸如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”。

您可以将选项传递给多态映射 - 块的元数需要为二,因为实例作为第一个参数传递,例如

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