Rails 管理对象在索引列表视图中呈现为 `#<User:`

Rails admin object rendering as `#<User:` in the index list view

我的模型函数:

def admin_user
  users.where('roles @> ARRAY[?]::varchar[]', ['admin']).first
end

我的管理员配置:

config.model 'Team' do
  list do
    field :admin_user
  end
end

显示如下:

如何link进入用户管理视图?

它显示 #<User:0x0....> 的原因是因为您的 admin_user return 是 ActiveRecord 的一个实例。当 RailsAdmin 输出时,它调用它的 #to_s 方法,默认情况下 return 上面的输出。您可以覆盖该方法,使其看起来像这样:

# User class

def to_s
  name
end

或者如果您愿意,您可以将 admin_user 修改为 return 格式正确的字符串而不是 ActiveRecord。

为了 'make it link to the User admin view' 在您的 config.model 中需要多一点配置。您需要为其定义一个 pretty_value 并覆盖默认渲染。

config.model 'Team' do
   pretty_value do
     # user's active record
     user = bindings[:object]
     # path to its RailsAdmin 'show' page
     path = bindings[:view].show_path(model_name: 'User', id: bindings[:object].id)
     # <a href...> tag to it
     bindings[:view].tag(:a, href: path) << user.admin_user
  end
end

请记住,最后一行中的 user.admin_user 假设它 return 是您想要在 link 或 User 中具有正确定义的字符串 #to_s.

这里有一个link官方文档https://github.com/sferik/rails_admin/wiki/Custom-list-fields-as-HTML-tags

还有一个办法 您可以创建另一个模型

class AdminUser < 用户 定义 self.default_scope 其中('roles @> ARRAY[?]::varchar[]',['admin']) 结束

after_initialize do
   self.roles << ['admin']
end

结束

然后是团队模式 class 团队 belongs_to :admin_user, foreign_key: :user_id

rails_admin do
  list do
    field :admin_user
  end
end

结束

这不仅会在团队索引中显示正确的内容,还允许您通过管理员的属性(如姓名或电子邮件)过滤和搜索团队,还允许您创建管理员有自己的索引和编辑视图。 这可能有点矫枉过正,但它肯定也会解决你的问题。