#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
Это позволяет вам, например, легко сделать имя поля динамическим.