ActiveRecord - заменить ошибку проверки модели предупреждением - PullRequest
10 голосов
/ 27 июля 2010

Я хочу иметь возможность заменить ошибку поля предупреждением при сохранении / обновлении модели в рельсах.По сути, я хочу просто написать обертку вокруг методов проверки, которые сгенерируют ошибку, сохранят модель и, возможно, будут доступны в хеше предупреждений (который работает так же, как хеш ошибок):

class Person < ActiveRecord::Base
  # normal validation
  validates_presence_of :name

  # validation with warning
  validates_numericality_of :age, 
                            :only_integer => true, 
                            :warning => true # <-- only warn
end

>>> p = Person.new(:name => 'john', :age => 2.2)
>>> p.save
=> true # <-- able to save to db
>>> p.warnings.map { |field, message| "#{field} - #{message}" }
["age - is not a number"] # <-- have access to warning content

ЛюбойИдея, как я мог бы реализовать это?Я смог добавить :warning => false значение по умолчанию к ActiveRecord::Validations::ClassMethods::DEFAULT_VALIDATION_OPTIONS, расширив модуль, но я ищу некоторое понимание того, как реализовать остальное.Спасибо.

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

Драгоценный камень validation_scopes использует некоторое волшебство метапрограммирования, чтобы предоставить вам все обычные функциональные возможности валидаций и объектов ActiveRecord :: Errors в контекстах, отличных от object.errors.

Например,Вы можете сказать:

validation_scope :warnings do |s|
  s.validates_presence_of :some_attr
end

Вышеупомянутая проверка будет запускаться как обычно для object.valid ?, но не будет блокировать сохранения в базе данных на object.save, если some_attr отсутствует.Любые связанные объекты ActiveRecord :: Errors будут найдены в object.warnings.

Проверки, указанные обычным способом без области действия, будут по-прежнему работать так, как ожидается, блокируя сохранения в базе данных и назначая объекты ошибок объектным ошибкам.

Автор имеет краткое описание развития драгоценного камня в своем блоге .

4 голосов
/ 01 ноября 2010

Я не знаю, готов ли он к Rails 3, но этот плагин делает то, что вы ищете:

http://softvalidations.rubyforge.org/

Отредактировано, чтобы добавить:

Чтобы обновить основные функции ActiveModel, я предложил следующее:

#/config/initializer/soft_validate.rb:
module ActiveRecord
  class Base
    def warnings
      @warnings ||= ActiveModel::Errors.new(self)
    end
    def complete?
      warnings.clear
      valid?
      warnings.empty?
    end
  end
end

#/lib/soft_validate_validator.rb
class SoftValidateValidator < ActiveModel::EachValidator
  def validate(record)
    record.warnings.add_on_blank(attributes, options)
  end
end

Он добавляет новый Errors подобный объект с именем warning и вспомогательный метод complete? , и вы можете добавить его в модель следующим образом:

class FollowupReport < ActiveRecord::Base
  validates :suggestions, :soft_validate => true
end
1 голос
/ 21 октября 2015

Я сделал свой собственный драгоценный камень для решения проблемы для Rails 4.1+: https://github.com/s12chung/active_warnings

class BasicModel
  include ActiveWarnings

  attr_accessor :name
  def initialize(name); @name = name; end

  warnings do
    validates :name, absence: true
  end
end

model = BasicModel.new("some_name")
model.safe? # .invalid? equivalent, but for warnings
model.warnings # .errors equivalent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...