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完成它的工作。更多关于验证的信息。