Rails验证... multiple:on options?

时间:2011-10-30 19:26:22

标签: ruby-on-rails validation

是否可以为:on选项提供多个条目 validates验证?

如下所示:

class Library < ActiveRecord::Base

  validates :presence => true, :on => [:create, :update, :some_other_action]

end

基本上我想在多个时运行一个特定的验证 动作在控制器中调用。例如,我想 在create操作上验证update操作的某些用户信息, 也可能还有其他一些行动。

虽然我不希望验证在所有方法上运行。

此外,如果有更简单的方法,那也很棒!

提前致谢!

4 个答案:

答案 0 :(得分:9)

是。可用于导轨4.1。

PR:https://github.com/rails/rails/pull/13754/files 官方文件:http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate

语法:on: [:create, :custom_validation_context]

答案 1 :(得分:5)

是创建和更新!

:on - 指定此验证何时处于活动状态。默认情况下在所有验证上下文中运行(无),其他选项为:创建:更新

但是将这些值视为数据库数据创建或更新语句,而不是rails控制器操作。他们可能对数据和数据库做了类似的事情,但它们是不同的 例如,您可能有另一个rails方法也可以更新数据库,可能会更新不同的字段,但是上面的':update'仍将考虑该方法,即使它不是来自名为'update'的rails操作。

答案 2 :(得分:1)

这是不可能的。为什么?这些:on事件不是控制器内的动作名称,而是预定义的ActiveRecord(MODEL)事件,:create:update:save

控制器方法和模型方法之间没有自动连接。

答案 3 :(得分:0)

有一个非常相似的问题,我必须跳过某些控制器操作的验证,我尝试了上述方法,但我的问题没什么不同,所以他们没有为我工作,所以我做的是使用attr_accessor和除非配置。

它将顺利地为您的事业服务。

模型中的

validates :password, presence: true, unless: :skip_password_validation

attr_accessor :skip_password_validation

当情况出现时我不需要验证,我只是在控制器中实现它

@user = User.find(params[:id])
@user.skip_password_validation = true