rails3显示相关值

时间:2013-11-18 18:36:33

标签: ruby-on-rails-3.2

一个类has_many材料,有很多颜色。试图以级联方式显示结果,如下所示

  <% @materials.each do |material| %>
      <%= material.name %> <br />
      <% params[:material_id] =  material.id %>
      <%= material.color.name %><br />
      <% @colors = Color.where(['id = ?', params[:material_id]]).all %>
      <% @colors.each do |color| %>
         <%= color.name %>
      <% end %>
  <% end %>

正在生成奇怪的列表。第一种材料的一个列表显示另一种材料的颜色,第二种材料显示正确的颜色,但只有1种有效颜色,尽管控制器显示了show动作

@model = Model.find(params[:id])
@materials = Material.where(['collection_id = ?', @model.collection_id]).all
@color = Color.new

最后一点是因为我们允许用户为列表末尾的给定材料创建颜色。

混淆铁轨的逻辑是什么?

1 个答案:

答案 0 :(得分:1)

你违反了许多最佳做法

  • 不要将内容分配给params,例如params[:material_id] = material.id,尤其是在观看
  • 不要在Color.where(['id = ?', params[:material_id]]).all
  • 等视图中调用查找程序
  • 避免在视图
  • 中分配像@color这样的实例变量
  • 不要调用可能导致混淆行为和运行时错误的模型Model

您也不依赖于rails对象关系映射功能。

如果您使用has_manybelongs_to正确设置了模型,则只需调用从数据库获取的记录上的方法,如@model.materials

如果所有内容都已正确编码,则您的show动作如下所示:

def show
  @model = Model.find(params[:id])
end

和这样的观点

<% @model.materials.each do |material| %>
  <%= material.name %><br>
  <% material.colors.each do |color| %>
     <%= color.name %><br>
  <% end %>
<% end %>