在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
所以链接实际上是在模块之前出现的:
admin_promotions_users_path
我不想要。这会导致错误,因为as:
会覆盖ActiveAdmin path_helper。我想要的是:
admin_users_path
。
简而言之,我认为这里的错误是我不知道在传递带符号和对象的数组时link_helper
扩展为什么。
答案 0 :(得分:3)
根据Ruby on Rails - link_to method,方法签名为link_to(body, url, html_options = {})
。 url
参数可以采用:
"/users/john-smith"
@user
[:admin, user]
如果url
参数是一个字符串,它只是将其传递给链接的href
。如果url
参数是Object,Array或路径,它会将值传递给幕后的url_for
方法。
url_for
将获取一个Object,确定类类型为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(链接到url_for
和polymorphic_url
)url_for
获取输入并将其传递给父方法,该方法由于某种原因添加了当前范围。 link_to
默认使用url_for
。 {<1}}是您想要&#34; unscope&#34; 的方法。我在自己的应用程序中以类似的情况测试了这个概念,并得到了与@ Jwan622相同的结果。
polymorphic_path
因此,你应该使用它:
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