rails对特定控制器和操作的ActiveRecord验证

时间:2014-04-07 13:42:42

标签: ruby-on-rails validation activerecord

是否可以在给定的控制器和操作上运行ActiveRecord验证。

例如,我有user_controllersignup_controller

我只需要在signup_controller #create action

上运行密码必需的验证

3 个答案:

答案 0 :(得分:18)

您可以使用if条件运行验证:

validates :email, presence: true, if: :validate_email?

现在您需要定义此实例方法(在您的模型中):

def validate_email?
  validate_email == 'true' || validate_email == true
end

validate_email属性可以是模型中的虚拟属性:

attr_accessor :validate_email

现在,您可以根据该虚拟属性执行电子邮件验证。例如,在signup_controller#create中,您可以执行以下操作:

def create
  ...

  @user.validate_email = true
  @user.save

  ...
end

答案 1 :(得分:1)

在user.rb中使用validates :password, :if => :password_changed?

如果users_controller中的表单未提交password字段,那么您应该没问题。

答案 2 :(得分:1)

只是实施@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