Ruby on rails Rails验证:如果带有复选框

Ruby on rails Rails验证:如果带有复选框,ruby-on-rails,validation,activerecord,Ruby On Rails,Validation,Activerecord,我使用的表单有两个复选框:option\u one和option\u two 如果选中了选项二而未选中选项一,则我不希望允许提交表单 换句话说,如果有人选中了选项二,他们也必须选中选项一 因此,在我的模型中,我写道: validates :option_one, :presence => true, :if => option_two_active?, :message => "Dummy message." 然后在MyController中,我添加了: def option

我使用的表单有两个复选框:
option\u one
option\u two

如果选中了
选项二而未选中
选项一,则我不希望允许提交表单

换句话说,如果有人选中了选项二,他们也必须选中选项一

因此,在我的模型中,我写道:

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

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

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

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

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

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

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

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

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

validates :option_one, :presence => true, :if => :option_two_active?, :message => "Dummy message."
此外,由于不能从模型中使用
params
,因此应通过
create
update\u attributes
或手动将该值从控制器分配给模型。如果要保留
选项\u two
字段,则该字段应为数据库列,否则只需创建属性访问器即可:

attribute_accessor :option_two

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

validates :option_one, :presence => true, :if => :option_two_active?, :message => "Dummy message."
此外,由于不能从模型中使用
params
,因此应通过
create
update\u attributes
或手动将该值从控制器分配给模型。如果要保留
选项\u two
字段,则该字段应为数据库列,否则只需创建属性访问器即可:

attribute_accessor :option_two

谢谢但是当我定义方法选项时,两个激活?在模型中,我得到了错误
未定义的局部变量或方法“params”
。我怎样才能解决这个问题?我为自己是一个noob而道歉。是的,
params
hash仅在控制器上下文中可用,而在模型中不可用。相反,您应该简单地将参数分配给模型,并在那里使用自动生成的方法。那么您甚至不需要定义其他方法。谢谢!但是当我定义方法选项时,两个激活?在模型中,我得到了错误
未定义的局部变量或方法“params”
。我怎样才能解决这个问题?我为自己是一个noob而道歉。是的,
params
hash仅在控制器上下文中可用,而在模型中不可用。相反,您应该简单地将参数分配给模型,并在那里使用自动生成的方法。那么您甚至不需要定义其他方法。谢谢!但是现在我得到了错误
未定义的局部变量或方法“params”
。如果不能使用“params”,如何从表单字段中获取值?是的,
option\u two
是一个db列。我不确定我是否理解正确,但您的方法似乎是将值写入数据库,然后读取它们,对吗?在将表单值写入数据库之前,我不能读取模型中的表单值吗?@Myxtic ActiveRecord默认情况下在持久化之前处理验证。它将永远不会作为无效对象保留到数据库中<代码>创建
更新_属性
保存
在任何验证条件未满足时都将失败。您应该将这些值分配给您的模型,让ActiveRecord完成它的工作。更多关于验证的信息。谢谢!但是现在我得到了错误
未定义的局部变量或方法“params”
。如果不能使用“params”,如何从表单字段中获取值?是的,
option\u two
是一个db列。我不确定我是否理解正确,但您的方法似乎是将值写入数据库,然后读取它们,对吗?在将表单值写入数据库之前,我不能读取模型中的表单值吗?@Myxtic ActiveRecord默认情况下在持久化之前处理验证。它将永远不会作为无效对象保留到数据库中<代码>创建
更新_属性
保存
在任何验证条件未满足时都将失败。您应该将这些值分配给您的模型,让ActiveRecord完成它的工作。更多关于验证的信息。