2011-10-29 25 views
6

我目前有一个Rails 3.0.10应用程序,我用简单的关联做了两个模型:has_many和belongs_to。Rails 3 - ActiveAdmin - 显示ActiveRecord对象而不是文本

安装完ActiveAdmin插件并创建相应的Ruby资源文件后,我发现了一些奇怪的行为。

下面,您可以看到“作业文件”belongs_to“Ernet客户端”。这些关联都正常工作,但显示名称显示为实际的ActiveRecord对象而不是客户端名称。

enter image description here

这是展示视图中的“工作文件”部分时:

enter image description here

但是,如果我去查看实际的客户端,显示正确的文本:

enter image description here

在“作业文件”中一定会出现问题这导致了这一点,但我无法弄清楚它可能是什么。谷歌搜索后,我发现这一点:http://groups.google.com/group/activeadmin/browse_thread/thread/2a261e070efa7bae

内JobFile.register文件I指定与此显示名称:

filter :ernet_client, :display_name_methods => :display_name 

这没有工作,虽然和我经历了所有其他可用的名称循环无济于事。

我查了一下ActiveAdmin的依赖和sass-rails似乎是唯一的 - 但那是如果你使用3.1,我使用的是Rails 3.0.10。

最后,以确保我的协会确系工作,我打开了Rails的控制台,并创建一个作业文件:

job = JobFile.new 
=> #<JobFile hash returned> 
job.ernet_client_id = 2 
=> 2 
job.ernet_client.client_name 
=> Target 

一切似乎是工作,因为它应该。

任何人都有任何见解如何解决这个问题?

回答

10

您是否尝试在ErnetClient模型上定义to_s方法?

def to_s 
    display_name 
end 

它看起来这是因为如果你确实叫to_s上,你会得到类似的结果控制台这些对象之一正被自动调用的方法。

+0

好吧,我按照你的建议在ErnetClient.rb模型中定义了一个to_s方法。它最终导致active_admin/resource/index.html.arb文件中出现错误:未定义的局部变量或方法'display_name'为#。不过,我也将符号“:display_name”放入方法中。这导致过滤器下拉列表为所有下拉选项逐字呈现“:display_name”。 – PhillipKregg

+0

那么,你没有'display_name'方法。 'to_s'方法应该返回你想为你的'ErnetClient'对象显示的任何字符串。 –

+0

从我所看到的,display_name是一个已经存在于viewhelpers下的ActiveAdmin插件中的方法:https://github.com/gregbell/active_admin/blob/master/lib/active_admin/view_helpers/display_helper.rb。有没有什么能够阻止我的应用程序看到它? – PhillipKregg

3

你可以在这里找到解释Filter select show object instead of object name

# Active Admin makes educated guesses when displaying objects, 
this is the list of methods it tries calling in order 
     setting :display_name_methods, [ :display_name, 
              :full_name, 
              :name, 
              :username, 
              :login, 
              :title, 
              :email, 
              :to_s ] 

你可以定义一个display_namefull_name,或...(见上表)模型中的...方法。 ActiveAdmin寻找其中之一。

相关问题