Rails_Admin显示名称而不是ID

24

我已经将rails_admin安装到我的应用程序中,我想做一些相当基本的事情...我有两个模型,它们的关联出现如预期...我有一个研讨会注册模型,它属于:user.

在rails_admin中,我的研讨会注册用户被列为User#1,User#1等。

我希望那是用户的名称。我已经成功做到了这一点:

config.model SeminarRegistration do
label "Seminar Signups"
# Found associations:
  configure :user, :belongs_to_association 
  configure :seminar_time, :belongs_to_association   #   # Found columns:
  configure :id, :integer 
  configure :user_id, :integer         # Hidden 
  configure :seminar_time_id, :integer         # Hidden 
  configure :created_at, :datetime 
  configure :updated_at, :datetime   #   # Sections:

list do
  field :user do
    pretty_value do
     user = User.find(bindings[:object].user_id.to_s)
     user.first_name + " " + user.last_name
    end
  end
  field :seminar_time
end
export do; end
show do; end
edit do; end
create do; end
update do; end
end
“pretty_value”部分提供了用户的名字和姓氏…但是有两个问题:
1)它不再是一个链接。如果我保留默认值(User #1,User #2等),它会提供到该用户的链接。如何恢复该链接?Rails_Admin是如何定义它的路径的?
2)在我的表单中必须通过id进行查找,这似乎非常笨重……
抱歉,如果这是一个基础问题。我已经阅读了手册并查找了其他问题,但还没有完全理解。我对rails也很陌生。
谢谢。
为了使链接起作用,我必须这样做:
我根据建议添加了一个帮助方法来获取完整的名称,但仍将其保留在我的视图帮助程序中:
module ApplicationHelper
 def full_name(user_id)
  user = User.find(user_id)
  user.first_name + " " + user.last_name
 end
end

然后,我像这样更改了“pretty_value”部分:

pretty_value do
  user_id = bindings[:object].user_id
  full_name = bindings[:view].full_name(user_id)
  bindings[:view].link_to "#{full_name}", bindings[:view].rails_admin.show_path('user', user_id)
end

基本上,要访问任何视图助手(无论是Rails自带的还是其他的),您都必须添加indings [:view].my_tag_to_use

例如,要获取用户的rails_admin路由,可以执行以下操作:

bindings[:view].rails_admin.show_path('user', user_id)
6个回答

38

我在谷歌上偶然发现了这个问题,并找到了一个更简单的方法来解决它。向您的模型添加titlename方法,rails_admin将使用该方法来代替显示“User#1”。

class User
  ...
  def name
    first_name + " " + last_name
  end
  ...
end
你可以使用title代替name,但在你的情况下使用name更合适。

有史以来最棒的黑客攻击! :D - AshwinKumarS
1
绝对精彩。这应该是被接受的答案。 - Brit200313
这个是可以正常工作的,但如果我去创建一个新用户并尝试,则会得到“未定义方法 ' + ' 用于 nil:NilClass”的错误。 - Batman
谢谢您的解决方案,我已经成功在List和Show操作中工作,但是在New和Edit(下拉菜单内)中,我仍然无法获得完整的名称,请查看:https://postimg.org/image/cpiqe9o5d/ @Brice Durand 在这里我做错了什么? - Nezir
字段:user_id, :枚举 do 枚举 do User.employee.collect {|p| [p.full_name, p.id]} end 这帮我解决了下拉菜单问题。再次感谢! - Nezir

28
RailsAdmin.config {|c| c.label_methods << :full_name}
或者
config.model full_name do
  object_label_method do
    :full_name
  end
end

然后在你的模型中添加一个full_name方法。


好的,这是更简洁的方法。但是没有给我链接...我编辑了我的答案以展示我是如何让它工作的。 - user1535082
它可以工作,但在关联查找中,您只能根据名字或姓氏之一进行搜索,而不能同时搜索两者。 - Michael Yagudaev
我还得到了一个带有object_label_method的链接,只需要定义关联即可。 - Ivan Stana

10

我这样做就像在为“角色”模型做事一样。

config.model 'Role' do
  object_label_method do
    :custom_label_method
  end
end

def custom_label_method
  "#{role_name}"
end

它有效


1
这正是我所需要的。我想为其他人添加一些上下文,你应该将“config.model”添加到rails_admin.rb初始化程序中,并将custom_label_method添加到模型类中。 - Nate Flink

7
你可以使用rails_admin object_label_method 查看链接 对于用户模型,在rails_admin.rb中
config.model 'User' do
  object_label_method do
   :custom_label_method
  end
end

在模型创建方法中。
def custom_label_method
  "User #{user_name}"
end

2
只需在您的用户模型中添加以下内容:

只需要在您的用户模型中添加以下内容:

# Prety User name display for rails_amdin
def to_s
    return self.name
end
def title
    return self.to_s
end

然后重新启动服务器。

你必须添加to_stitle方法,并且你可以根据你的用户架构更改self.name为任何你想要的名称。

在Rails 4中,这对我起作用。


你不需要使用 to_s。定义 titlename 就足够了,参见这里的源代码。 - Jan Klimo

0

对于像名称这样的通用字段,我通常会在模型上添加一个方法。但另一种解决方案是在RA中为该字段配置标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接