2

我正在使用具有 2 个复选框的表单:option_oneoption_two.

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

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

4

2 回答 2

2

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

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

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

于 2012-08-15T14:21:12.333 回答
2

您必须使用符号指定条件方法:

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

此外,由于您不能从模型中使用,您应该使用、或手动params将该值从控制器分配给模型。如果你想持久化这个字段,那么它应该是一个数据库列,否则你可以创建一个属性访问器:createupdate_attributesoption_two

attribute_accessor :option_two
于 2012-08-15T14:21:18.813 回答