Rails - 验证取决于它是哪个控制器

时间:2011-11-29 23:24:17

标签: ruby-on-rails

我有两个控制器使用一个型号。其中一个控制器需要validate_presence_of:name,但另一个不需要。如何设置验证,以便它不会在不需要验证的一个控制器上出错?

3 个答案:

答案 0 :(得分:4)

您可以创建两个模型:

class ModelA < ActiveRecord::Base
end

class ModelB < ModelA
  validates_presence_of :name
end

然后在控制器中引用正确的模型。

或者您可以在创建或更新时检查控制器中的名称。

class ModelController < ApplicationController
  before_filter :check_name, :only => [:create, :update]
  # ...
  private
    def check_name
      #Handle it how you want, here's an example
      raise Exception if params[:model][:name].nil? || params[:model][:name].blank?
    end
end

答案 1 :(得分:1)

除非始终适用,否则我不会使用验证。您可以使用@model.name.present?之类的内容来检查控件中是否存在您需要的名称。

答案 2 :(得分:1)

另一个(复杂的)选项是在设置验证时使用条件修饰符:

validates_presence_of :name, :unless => :skip_name_validation?

def skip_name_validation?
  @skip_name_validation
end

def skip_name_validation!
  @skip_name_validation = true
end

def save_without_name_validation
  skip_name_validation!
  save
end

然后在你的控制器中:

@object.save_without_name_validation

我觉得这更明确一些。奖金方法:

def without_name_validation!
  tap {|record| record.skip_name_validation! }
end

# on a relation :
def self.without_name_validation!
  map( &:skip_name_validation! )
end

# in a controller
@object.without_name_validation!.save
@objects.without_name_validation!.each do # something
但是,我承认,其他解决方案更优雅。