Rails访问模型中模块中的共享定制验证

时间:2019-04-08 23:21:49

标签: ruby-on-rails ruby ruby-on-rails-5

我试图弄清楚如何创建一个共享的自定义验证,该验证可以在放置在lib / validations.rb文件夹中的模型中使用。

module Validations
  extend ActiveSupport::Concern

  # included do


  def email_format_validation
    if self.email.present?
      if !validates_format_of :email, with: email_regex
        self.errors.add(:email, "doesn't exist")
      end
    end
  end


  def email_regex
    /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
  end
end

因此,在我的模型中,这允许我这样做:

validate :email_format_validation

在其他模型中,我试图仅致电email_regex

validate :user_email, with: email_regex

会产生以下错误:

undefined local variable or method `email_regex' for #<Class....>

我尝试在模型中使用include Validationsextend Validationsrequire 'validations'等,但是没有运气。我还尝试过使用class << self块将模块方法放在included do内,将方法设置为self.email_regex并调用Validations.email_regex,但似乎没有任何效果。

3 个答案:

答案 0 :(得分:2)

我尝试了以下方法,并且对我有用:

在模型/问题中创建了validates.rb

module Validations
  extend ActiveSupport::Concern

  def email_format_validation
    if self.email.present?
      if !validates_format_of :email, with: email_regex
        self.errors.add(:email, "doesn't exist")
      end
    end
  end


  def email_regex
    /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
  end
end

在模型中:

include Validations

class User < ApplicationRecord
  validate :email_format_validation
  validates :user_email, with: :email_regex
end

user_email是字段名称

答案 1 :(得分:0)

您是否尝试过使用require_relative验证

答案 2 :(得分:0)

从 Rails 3 开始,您还可以使用 validates_with

return template.evaluate().setTitle('GPS - Visor Gestión de Solicitudes - Desarrollo').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

这允许您例如轻松使字段名称动态化。