一个类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
最后一点是因为我们允许用户为列表末尾的给定材料创建颜色。
混淆铁轨的逻辑是什么?
答案 0 :(得分:1)
你违反了许多最佳做法
params
,例如params[:material_id] = material.id
,尤其是在观看Color.where(['id = ?', params[:material_id]]).all
@color
这样的实例变量
Model
您也不依赖于rails对象关系映射功能。
如果您使用has_many
和belongs_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 %>