Rails доступ к общей пользовательской проверке в модуле внутри модели

#ruby-on-rails #ruby #ruby-on-rails-5

#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 Validations , extend Validations require 'validations' и т.д. В моей модели, но безуспешно. Я также попытался поместить методы модуля в class << self , используя included do блок, установив методы как self.email_regex и вызывая Validations.email_regex , но, похоже, ничего не работает.

Комментарии:

1. Ознакомьтесь с руководством по пользовательскому валидатору guides.rubyonrails.org /… . Вы можете создать класс, расширяющий ActiveModel::Validator вместо использования concern и использовать validates_with.

2. можете ли вы попробовать переместить файл validations.rb в app/models/concerns папку и попробовать добавить include Validations в свою модель

3. @Nandhini На самом деле у меня изначально были проблемы с этим до его перемещения, и у меня была такая же проблема

4. @asalgan опубликовал мой ответ. У меня это сработало. Попробуйте то же самое и дайте мне знать, если какая-либо проблема не устранена.

5. @Nandhini на самом деле я понял, что это не решает мою проблему, когда класс не наследуется от ActiveRecord::Base если это отдельный класс, то я все еще сталкиваюсь с проблемой выше, есть идеи относительно того, почему это происходит?

Ответ №1:

Я попробовал следующее, и это сработало для меня:

Создал validations.rb в models / concerns

 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. по-видимому, я использовал validate вместо validates — это также сработало, когда я сделал validates_format_of упс! Спасибо!

Ответ №2:

Вы пробовали использовать проверки require_relative

Ответ №3:

Начиная с Rails 3, вы также можете использовать validates_with:

 class EmailValidator < ActiveModel::Validator
  def validate(record)
    if record.email.present?
      if !email_regex.match?(record.email)
        record.errors.add(:email, "is invalid")
      end
    end
  end

  private

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

class User < ApplicationRecord
  validates_with EmailValidator
end
  

Это позволяет вам, например, легко сделать имя поля динамическим.