我有两个控制器使用一个型号。其中一个控制器需要validate_presence_of:name,但另一个不需要。如何设置验证,以便它不会在不需要验证的一个控制器上出错?
答案 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
但是,我承认,其他解决方案更优雅。