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

Ruby on rails Rails-验证取决于它是哪个控制器,ruby-on-rails,Ruby On Rails,我有两个控制器使用一个模型。其中一个控制器需要验证:name的存在,但另一个控制器不存在。如何设置验证,使其不会在不需要验证的控制器上出错?除非验证始终适用,否则我不会使用验证。您可以使用@model.name.present这样的命令?检查控制器中是否存在您需要的名称。我不会使用验证,除非它始终适用。您可以使用@model.name.present这样的命令?要检查控制器中是否存在您需要的名称。您可以创建两个模型: class ModelA < ActiveRecord::Base en

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

除非验证始终适用,否则我不会使用验证。您可以使用@model.name.present这样的命令?检查控制器中是否存在您需要的名称。

我不会使用验证,除非它始终适用。您可以使用@model.name.present这样的命令?要检查控制器中是否存在您需要的名称。

您可以创建两个模型:

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

您可以创建两个模型:

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

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

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

不过,我承认,另一种解决方案更为优雅

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

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

不过,我承认,另一种解决方案更为优雅

第一个答案是+1。听起来像是一个儿童模型类的工作。MattC,我同意,两个模型比控制器方法更可取。谢谢+第一个答案是1。听起来像是一个儿童模型类的工作。MattC,我同意,两个模型比控制器方法更可取。谢谢这个gem本质上做同样的事情,而不需要自己编码:这个gem本质上做同样的事情,而不需要自己编码: