当在 Rails 中传递带有符号和对象的数组时,link_to 帮助器会扩展为什么?

Jwa*_*622 2 ruby-on-rails activeadmin

在 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当传递带有符号对象的数组时,我不知道 a 扩展为什么。

小智 5

根据Ruby on Rails-link_to 方法,方法签名是link_to(body, url, html_options = {})。参数url可以取:

  1. 一个字符串就像"/users/john-smith"
  2. 一个像这样的对象@user
  3. 一个数组就像[:admin, user]
  4. 类似于 admin_user_path(user) 的路径

如果url参数是字符串,它只是将其传递给href链接。如果url参数是对象、数组或路径,它将值传递给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>

更新

根据这个堆栈溢出答案(链接到url_forpolymorphic_urlurl_for获取输入并将其传递给父方法,该方法由于某种原因添加了当前范围。默认link_to使用。如果您想“取消范围” ,则需要使用该方法。我在自己的应用程序中在类似的情况下测试了这个概念,并得到了与@Jwan622相同的结果。url_forpolymorphic_path

url_for([:admin, user]) # Does not exist
#=> admin_promotions_users_path 

polymorphic_path([:admin, user]) # Exists
#=> admin_users_path
Run Code Online (Sandbox Code Playgroud)

因此,您应该使用这个:

link_to user.full_name, admin_users_path
Run Code Online (Sandbox Code Playgroud)

或者这样(如果您需要动态生成链接):

link_to user.full_name, polymorphic_path([:admin, user])
Run Code Online (Sandbox Code Playgroud)