只是实现@markets 答案的提示
我们可以使用
with_options if: :validate_email? do |z|
z.validates :email, presence: true
z.validates :name, presence: true
end
用于对我们的特定操作进行多次验证。
此外,我们使用 session 来传递一个变量,该变量指示此操作的参数需要一些验证
控制器:
before_action :no_validate, only: [:first_action, :second_action, ..]
before_action :action_based_validation, only: [:first_action, :second_action, ..]
def first_action; end
def second_action; end
def update
..
@instance.validate = session[:validate]
..
if @instance.update(instance_params)
..
end
end
private
def no_validate
session[:validate] = nil
end
def action_based_validation
# action_name in first_action will = "first_action"
session[:validate] = action_name
end
型号
attr_accessor :validate
with_options if: "validate == 'first_action'" do |z|
z.validates :email, presence: true
..more validations..
end
with_options if: "validate == 'second_action'" do |z|
z.validates :name, presence: true
..more validations..
end
更多细节:
http://guides.rubyonrails.org/active_record_validations.html#conditional-validation