Rails 3.2 предотвращает сохранение объекта с помощью ошибок - PullRequest
5 голосов
/ 13 марта 2012

У меня есть объект ActiveRecord, и я хотел бы предотвратить его сохранение без постоянной проверки модели. Раньше вы могли делать что-то подобное, используя errors.add, но это больше не работает.

user = User.last
user.errors.add :name, "name doesn't rhyme with orange"
user.valid? # => true
user.save   # => true

или

user = User.last
user.errors.add :base, "my unique error"
user.valid? # => true
user.save   # => true

Как я могу предотвратить сохранение пользовательского объекта в Rails 3.2 без изменения его модели?

Ответы [ 3 ]

7 голосов
/ 13 марта 2012

Вы можете установить errors, но сделайте это с помощью метода проверки, например ::

validate :must_rhyme_with_orange

def must_rhyme_with_orange
  unless rhymes_with_orange?
    errors.add(:name, "doesn't rhyme with orange")
  end
end

Если вы хотите условно запустить валидацию, используйте один трюк attr_accessor и условие защиты:

attr_accessor :needs_rhyming

validate :must_rhyme_with_orange, :if => Proc.new {|o| o.needs_rhyming}

> u = User.last
> u.needs_rhyming = true
> u.valid? # false
2 голосов
/ 13 марта 2012

Ваша проблема работает? перезапустит проверки .. сброс ваших ошибок.

     pry(main)> u.errors[:base] << "This is some custom error message"
     => ["This is some custom error message"]
     pry(main)> u.errors
     => {:base=>["This is some custom error message"]}
     pry(main)> u.valid?
     => true
     pry(main)> u.errors
     => {}
     pry(main)> 

Вместо этого просто проверьте, есть ли u.errors.blank?

1 голос
/ 14 января 2014

Это небольшое отклонение от первоначального вопроса, но я нашел этот пост после попытки нескольких вещей. Rails имеет встроенную функциональность, позволяющую отказаться от сохранения объекта, если ему присвоено значение атрибута _destroy как true. Очень полезно, если вы занимаетесь созданием модели на уровне контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...