Rails验证和相关表问题

时间:2015-06-01 17:27:16

标签: ruby-on-rails ruby ruby-on-rails-4

有很多学生,每个学生都属于一个项目。

我有一个控制器:

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。如果我从模型中取出验证规则,一切都会再次起作用 - 所以我非常确定验证是问题的核心。

1 个答案:

答案 0 :(得分:0)

您的控制器中是否有更新方法?我的猜测是在更新操作中你有一个if语句,说明如果保存失败,再次渲染编辑模板。如果要从update方法呈现编辑模板,则视图不再了解@programs,因此您需要在update方法中重新定义,或者创建before_action。