当在 Rails 中传递一个带有符号和对象的数组时,link_to 助手会扩展到什么?
What does a link_to helper expand to when passed an array with a symbol and object in Rails?
在 Rails 中(特别是在 ActiveAdmin 中),link_to 帮助程序将数组作为第二个参数传递是做什么的?这方面的文档在哪里?
我有这个代码:
index pagination_total: false do
column :name, :sortable => :first_name do |user|
link_to user.full_name, [:admin, user]
end
那有什么作用? [:admin, user] 在这里做什么?
这里有一件令人困惑的事情是我的 ActiveAdmin 面板定义为:
ActiveAdmin.register Promotions::User, as: "User" do
所以 link 实际上是在模块前面加上这样的:
admin_promotions_users_path
我不想要。这会导致错误,因为 as:
覆盖了 ActiveAdmin path_helper。我想要的是:
admin_users_path
。
简而言之,我认为这里的错误是我不知道当传递一个带有符号对象的数组时 link_helper
扩展到什么。
根据Ruby on Rails - link_to method,方法签名是link_to(body, url, html_options = {})
。 url
参数可以采用:
- 像
"/users/john-smith"
这样的字符串
- 像
@user
这样的对象
- 像
[:admin, user]
这样的数组
- 像 admin_user_path(user)
这样的路径
如果 url
参数是字符串,它只是将其传递给 link 的 href
。如果 url
参数是对象、数组或路径,它会将值传递给幕后的 url_for
方法。
url_for
会取一个Object,判断class类型为User
,寻找对应的user_path(@user)
路由方法。对于数组,它首先接受任何符号并使用它来构造 url 助手的名称,然后它将接受任何对象并将其作为值传递。这就是 link_to user.full_name, [:admin, user]
转换为 admin_user_path(@user)
最终变成 <a href="/users/john-smith">John Smith</a>
的方式
更新
根据 this Stack Overflow answer (which links to url_for
and polymorphic_url
) url_for
获取输入并将其传递给父方法,父方法出于某种原因添加了当前作用域。 link_to
默认使用 url_for
。如果你想"unscope"它,polymorphic_path
是你需要的方法。我在自己的应用程序中以类似的情况测试了这个概念,得到了与@Jwan622 相同的结果。
url_for([:admin, user]) # Does not exist
#=> admin_promotions_users_path
polymorphic_path([:admin, user]) # Exists
#=> admin_users_path
因此,您应该使用这个:
link_to user.full_name, admin_users_path
或者这个(如果你需要动态生成link):
link_to user.full_name, polymorphic_path([:admin, user])
在 Rails 中(特别是在 ActiveAdmin 中),link_to 帮助程序将数组作为第二个参数传递是做什么的?这方面的文档在哪里?
我有这个代码:
index pagination_total: false do
column :name, :sortable => :first_name do |user|
link_to user.full_name, [:admin, user]
end
那有什么作用? [:admin, user] 在这里做什么?
这里有一件令人困惑的事情是我的 ActiveAdmin 面板定义为:
ActiveAdmin.register Promotions::User, as: "User" do
所以 link 实际上是在模块前面加上这样的:
admin_promotions_users_path
我不想要。这会导致错误,因为 as:
覆盖了 ActiveAdmin path_helper。我想要的是:
admin_users_path
。
简而言之,我认为这里的错误是我不知道当传递一个带有符号对象的数组时 link_helper
扩展到什么。
根据Ruby on Rails - link_to method,方法签名是link_to(body, url, html_options = {})
。 url
参数可以采用:
- 像
"/users/john-smith"
这样的字符串
- 像
@user
这样的对象
- 像
[:admin, user]
这样的数组
- 像 admin_user_path(user) 这样的路径
如果 url
参数是字符串,它只是将其传递给 link 的 href
。如果 url
参数是对象、数组或路径,它会将值传递给幕后的 url_for
方法。
url_for
会取一个Object,判断class类型为User
,寻找对应的user_path(@user)
路由方法。对于数组,它首先接受任何符号并使用它来构造 url 助手的名称,然后它将接受任何对象并将其作为值传递。这就是 link_to user.full_name, [:admin, user]
转换为 admin_user_path(@user)
最终变成 <a href="/users/john-smith">John Smith</a>
更新
根据 this Stack Overflow answer (which links to url_for
and polymorphic_url
) url_for
获取输入并将其传递给父方法,父方法出于某种原因添加了当前作用域。 link_to
默认使用 url_for
。如果你想"unscope"它,polymorphic_path
是你需要的方法。我在自己的应用程序中以类似的情况测试了这个概念,得到了与@Jwan622 相同的结果。
url_for([:admin, user]) # Does not exist
#=> admin_promotions_users_path
polymorphic_path([:admin, user]) # Exists
#=> admin_users_path
因此,您应该使用这个:
link_to user.full_name, admin_users_path
或者这个(如果你需要动态生成link):
link_to user.full_name, polymorphic_path([:admin, user])