有很多学生,每个学生都属于一个项目。
我有一个控制器:
def edit
@student = Student.find(params[:id])
@programs = Program.all
end
然后我有一个编辑表格(简化):
<%= f.label(:program_id, "Program") %>
<%= f.select(:program_id, @programs.collect {|c| [c.name, c.id]}) %>
最后,我为学生准备了一个模型:
class Student < ActiveRecord::Base
belongs_to :program
validates :first_name, presence: true
end
只要输入名字,我就可以更新学生。如果我将名字留空,则会收到错误undefined method 'collect' for nil:NilClass
然而,如果我稍微改变一下形式,一切都会奏效。像这样:
<%= f.label(:program_id, "Program") %>
<%= f.select(:program_id, Program.all.collect {|c| [c.name, c.id]}) %>
注意那里的Programs.all
。而不是在控制器中。
是什么给出的?我真的很想在控制器中定义@programs。我错过了一些明显的东西吗?
谢谢!
P.S。如果我从模型中取出验证规则,一切都会再次起作用 - 所以我非常确定验证是问题的核心。
答案 0 :(得分:0)
您的控制器中是否有更新方法?我的猜测是在更新操作中你有一个if语句,说明如果保存失败,再次渲染编辑模板。如果要从update方法呈现编辑模板,则视图不再了解@programs,因此您需要在update方法中重新定义,或者创建before_action。