从模型的“显示视图”引用另一个模型的“索引”视图

时间:2013-06-06 08:16:07

标签: ruby-on-rails ruby-on-rails-3

在“颜色索引视图”中,以下内容生成一个可单击的链接,该链接将我带到“彩色显示视图”。

<% @colors.each do |color| %>
  <tr>
    <td><%= link_to color.color_name, color_path(color) %></td>

在模型中,我有:

class Color < ActiveRecord::Base
  belongs_to :product    

我还有一个产品索引视图,我想创建一个指向Color Show View的可点击链接,但我无法使其工作。

这不起作用(一方面,color_name不是颜色表中的主键:

<% @products.each do |product| %>
  <tr>
    <td><%= link_to product.color_name, product.color_name, color_path(color.color_name) %></td>

在模型中,我有:

class Product < ActiveRecord::Base
  has_many :colors   

这不起作用,当我尝试使用颜色索引视图时出现错误,如:

undefined local variable or method color

有什么想法吗?

解决方案:

以下是最终工作的内容:

<% color_id = Color.find_by_color_name(product.color_name) %>
<td><%= link_to product.color_name, color_path(color_id) %></td>

显然也可以在一行上完成,但是两行使代码更具可读性(我认为)

我不明白为什么有人认为有必要降级这个问题。

2 个答案:

答案 0 :(得分:0)

color.color_name给出错误,因为您在产品索引视图中没有颜色对象。

如果存在一对一的关系,请尝试<td><%= link_to product.color_name, product.color_name, color_path(product.color) %></td>

如果存在一对多关系,请尝试<td><%= link_to product.color_name, product.color_name, color_path(product.colors.first) %></td>

答案 1 :(得分:0)

您的Product has_many colors。因此,您的代码应该是这样的:

<% @products.each do |product| %>
  <tr>
  <% product.colors.each do |color| %>
    <td><%= link_to color.color_name, color_path(color) %></td>
  <% end %>
  </tr>
<% end %>

它会迭代每个产品的颜色,并向link路径显示show

注意:可能遇到N + 1问题。以上只是为了给你指路。