【问题标题】:rails ActiveRecord validation on specific controller and actionrails ActiveRecord 验证特定控制器和操作
【发布时间】:2014-04-07 13:42:42
【问题描述】:

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

例如我有user_controllersignup_controller

我只需要在 signup_controller#create action 上运行密码验证

【问题讨论】:

  • 你使用的rails版本是什么
  • 我使用的是 Rails 4.0.4

标签: ruby-on-rails validation activerecord


【解决方案1】:

您可以使用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

【讨论】:

  • 这是创建/更新操作的好答案,但它不适用于销毁。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多