2012-08-15 49 views
2

我正在处理具有2个复选框的表单:option_oneoption_twoRails验证:如果带有复选框

如果选中option_two而不是option_one,我不想允许提交表格。

换句话说,如果有人检查option_two,他们也必须检查option_one

所以在我为MyModel我写道:

validates :option_one, :presence => true, :if => option_two_active?, :message => "Dummy message." 

然后在myController的,我说:

def option_two_active? 
    params[:option_two] == "1" 
end 

但它不断给我下面的错误:

NoMethodError in MyController#index 

是我的方法正确吗?我怎样才能做到这一点?提前致谢。

回答

2

您必须指定一个符号条件方法:

validates :option_one, :presence => true, :if => :option_two_active?, :message => "Dummy message." 

另外,你因为你不能使用params从模型中,你应该是值分配给从控制器的型号,无论是与create,update_attributes,或手动。如果你想坚持option_two字段,那么它应该是一个数据库列,否则你可以创建一个属性访问器:

attribute_accessor :option_two 
+0

谢谢!但是现在我得到错误'未定义的局部变量或方法'params''。如果我不能使用'params',我怎样才能从表单域获取值? – Myxtic 2012-08-15 14:43:33

+0

@Myxtic对,我编辑了答案。看一看。 – alf 2012-08-15 15:14:23

+0

是的,'option_two'是一个db列。我不知道我是否理解这个正确的,但似乎你的方法是将值写入数据库,然后阅读它们,对吧?在将它们写入数据库之前,我无法读取模型中的表单值吗? – Myxtic 2012-08-15 15:58:44

2

您引用方法的方式,将在首次加载类时直接调用。但是,:if参数预计将与在验证期间随后调用的proc一起使用,或与代表方法名称的符号一起使用。在你的情况下,你应该这样设置你的验证是这样的:

validates :option_one, :presence => true, :if => :option_two?, :message => "Dummy message." 

注意方法名前的冒号。另外,验证方法需要在模型上定义,而不是控制器。幸运的是,ActiveRecord已经为布尔字段定义了正确的方法,正如这里所使用的。

+0

谢谢!但是当我定义方法option_two_active?在模型中,我得到错误'未定义的局部变量或方法'params''。我怎样才能解决这个问题 ?我为做noob而道歉。 – Myxtic 2012-08-15 14:39:41

+0

是的,'params'哈希仅在控制器上下文中可用,不在模型中。相反,您应该简单地将参数分配给模型,并在那里使用自动生成的方法。那么你甚至不需要定义一个额外的方法。 – 2012-08-15 14:42:57