当在Rails中传递一个带有符号和对象的数组时,link_to助手会扩展到什么



在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会扩展到什么。

根据RubyonRails-link_to方法,方法签名为link_to(body, url, html_options = {})url参数可以取:

  1. 类似字符串的"/users/john-smith"
  2. 类似@user的对象
  3. 类似[:admin, user]的阵列
  4. 类似admin_user_path(user)的路径

如果url参数是String,它只会将其传递给链接的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>

更新

根据这个堆栈溢出答案(链接到url_forpolymorphic_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_to user.full_name, polymorphic_path([:admin, user])

最新更新