我用Rails v2.3

如果我有model:

class car < ActiveRecord::Base

  validate :method_1, :method_2, :method_3

  ...
  # custom validation methods
  def method_1
    ...
  end

  def method_2
    ...
  end

  def method_3
    ...
  end
end

正如你在上面看到的,我有3 custom validation methods个,我用它们来验证模型.

如果我在这个模型类中有另一个方法保存模型的新实例,如下所示:

# "flag" here is NOT a DB based attribute
def save_special_car flag
   new_car=Car.new(...)

   new_car.save #how to skip validation method_2 if flag==true
end

我想跳过method_2的验证,在这个节省新车的特殊方法中,how to skip the certain validation method?

推荐答案

将您的模型更新到此版本

class Car < ActiveRecord::Base

  # depending on how you deal with mass-assignment
  # protection in newer Rails versions,
  # you might want to uncomment this line
  # 
  # attr_accessible :skip_method_2

  attr_accessor :skip_method_2 

  validate :method_1, :method_3
  validate :method_2, unless: :skip_method_2

  private # encapsulation is cool, so we are cool

    # custom validation methods
    def method_1
      # ...
    end

    def method_2
      # ...
    end

    def method_3
      # ...
    end
end

然后在控制器中放入:

def save_special_car
   new_car=Car.new(skip_method_2: true)
   new_car.save
end

如果通过控制器中的params变量获得:flag,则可以使用

def save_special_car
   new_car=Car.new(skip_method_2: params[:flag].present?)
   new_car.save
end

Ruby-on-rails相关问答推荐

Web控制台不会出现在例外页面Rails 7.1.1上

Rails 7 - 富文本不显示附加的媒体内容

这种使用on:的语法在 Ruby on Rails 中意味着什么?

BigDecimals 的总和最终成为整数 [Ruby on Rails]

在 Rails 6.1 升级后,作业(job)规范使用 Minitest::UnexpectedError 包装错误

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

$redis 全局变量与 ruby​​ on rails

在命名空间内设计

如何在 ruby​​ on rails 中获取控制器和操作列表?

bundle和gem安装的区别?

使用回形针使用 Activeadmin Rails 上传文件

使用god 监控独角兽 - 以非零代码开始退出 = 1

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

Ruby on Rails 中的MySQL 服务器已经消失

Rails:进行不可逆转的迁移是不是很糟糕?

Rails:如何修复‘生产’环境缺少 secret_key_base

在 Rails 中命名布尔列

Rails:在 link_to 中保留 GET 查询字符串参数

没有路由匹配缺少必需的键:[:id]

在 Rails 3 中突出显示当前页面的最佳方法? -- 有条件地将css类应用于链接