2015-06-02 32 views
0

在rails中处理select标记时,我在理解options_from_collection_for_select方法时遇到了麻烦。从我的理解,这个助手可以任意对象和两个附加参数的集合:方法的名称来读取,分别期权价值和文本:options_from_collection_for_select方法的实现

<%= options_from_collection_for_select(Product.all, :id, :name) %> 

这是很好的例子,以帮助了解助手和仅当idname字段属于Product时才有效。假设,在我的情况下,我想product.category.name显示为一个文本,那么我怎么能实现这一点。

同样,productcategory模型具有one-to-one关联。

为了实现我的目标,我尝试了以下方法,但我认为,这种关联违反了规则。

<%= options_from_collection_for_select(Product.all, :id, Product.category_name) %> 

因此,有人可以用更好的解决方案建议?

+0

粘贴完整的选择标记你正在尝试做 –

回答

0

你需要有getter方法为category_nameProduct模式:

def category_name 
    self.category.name 
end 

而且在你看来,你可以简单地调用:category_name

<%= options_from_collection_for_select(Product.all, :id, :category_name) %> 

希望这将有助于

+0

感谢@Madan现在我所知道的问题,而不是定义'category_name'我的方法使用范围。你可以使用范围建议相同吗?谢谢你 – SujitS

0

在这种情况下,您可以使用模型方法。

product.rb

def get_category_name 
    self.category.name 
end 

,你可以把它在options_from_collection_for_select作为

<%= options_from_collection_for_select(Product.all, :id, :get_category_name) %> 

首先,它会检查在产品表中是否存在任何列,然后它会检查为方法。

0

您可以使用产品模式中的category_name制作实例方法。

def category_name 
    self.category.name 
end 

然后,在视图中使用此助手。

<%= options_from_collection_for_select(Product.all, :id, :category_name) %> 
0

在产品型号:

def category_name 
    self.category.name 
end 

,并考虑:

<%= options_from_collection_for_select(Product.all, 'id', 'category_name') %>