在视图中声明实例变量并传递给模型

时间:2010-01-14 04:38:51

标签: ruby-on-rails validation

我试图通过将视图中的变量传递给模型来条件化视图中发送的字段的验证,以便它知道要检查哪组字段。

该模型如下所示:

  validates_presence_of :first_name, :last_name, :if => :registration_step?
  validates_numericality_of :primary_phone, :if => :contact_step?

  def registration_step?
    @step == :register
  end
  def contact_step?
    @step == :contact
  end

我不确定在我的视图中我必须放置什么才能使一切正常运行。我试过了

<% @step = :register %>

<% @step = :contact %>

以及其他一些组合(:步骤,以及@step与'注册'和'联系'。我知道这只是语法问题,或者我只是在模型中遗漏了一件事,但我可以'弄明白了。

1 个答案:

答案 0 :(得分:1)

视图中设置的实例变量不会直接进入模型,也不会直接进入模型。您描述的问题 - 条件部分 - 是我们今天刚刚尝试处理的问题。

我认为你最好的选择是在你的模型上设置一个attr_accessor,你可以在控制器的创建,更新,任何动作中设置 - 这是不应该在视图中设置的。进入模型后,您可以使用一种方法在if条件中检查此属性的值以进行验证。但是,绝对不要将其作为表单中的隐藏字段传递。您不希望信任此类事物可能被用户操纵。

回复评论:

如果您将step添加为attr_accessor,则在控制器中,您应该可以执行类似

的操作
@my_model = MyModel.new(params[:model])
@my_model.step = :register
if @my_model.save...

而且,在你的模型中,有些东西是

validates_presence_of :first_name, :last_name, :if => :registration_step?
def registration_step?
  step == :register
end