rails 3 - принимает вложенные атрибуты для проверки перед уничтожением - PullRequest
2 голосов
/ 30 мая 2011

У меня есть модель учителя, которая принимает классы_атедов для классов. Я не хочу иметь возможность удалять класс, если в классе есть пользователи и я хочу напечатать сообщение проверки.

Вот что у меня есть ...

class Teacher < ActiveRecord::Base
    accepts_nested_attributes_for :klasses, :reject_if => proc { |a| a['name'].blank? }, :allow_destroy => true
end

class Klass < ActiveRecord::Base

    belongs_to :teacher
    has_many :users
    before_destroy :reject_if_has_users

    private 

    def reject_if_has_users
      if users.length > 0
        errors.add_to_base "You cannot delete this class as it contains users."
        false
      else
        true
      end
    end

end

Я хочу, чтобы проверка завершилась неудачно, когда я пытаюсь удалить класс из учителя, содержащего пользователей, когда я использую accepts_nested_attributes_for, и передать "klasses_attributes" => {"0" => {"name" => "test" , "_destroy" => "1", "id" => "17183"} хеш.

Приведенный выше метод предотвратит удаление класса, если у меня нет строки error.add_to_base. Однако это не приведет к отображению сообщения проверки. Когда у меня есть эта строка, это не мешает удалению.

Спасибо

Тим

1 Ответ

1 голос
/ 30 мая 2011

Проверка не происходит при удалении записи, только при сохранении записи.То, как я справлялся с этим в одном из моих проектов, вызывает исключение в модели, а затем спасает от этого исключения в моем контроллере и отображает мгновенное предупреждение.Как это:

Модель:

class Klass < ActiveRecord::Base
  before_destroy :reject_if_has_users

  private 

  def reject_if_has_users
    raise "You cannot delete this class as it contains users." if users.length > 0
  end
end

Контроллер учителей:

def update
  # Code for updating the teacher
rescue RuntimeError => e
  redirect_to teacher_url(@teacher, :alert => e.message) and return false
end
...