当在 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 参数可以采用:

  1. "/users/john-smith"
  2. 这样的字符串
  3. @user
  4. 这样的对象
  5. [:admin, user]
  6. 这样的数组
  7. 像 admin_user_path(user)
  8. 这样的路径

如果 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])