Условие обратного вызова before_destroy (Rails) не работает

Условие "unless articles.count == 0" в фильтре before_destroy не работает.

У кого-нибудь были подобные проблемы?

class Category

has_many :articles
before_destroy :ensure_has_no_articles

private

def ensure_has_no_articles
  unless articles.count == 0
    errors[:base] << "cannot delete category that has articles"
    return false
  end
end

person Neon_10    schedule 08.09.2016    source источник
comment
Что вы имеете в виду под не работает? Какого поведения вы ожидаете и какое вы наблюдаете?   -  person mrzasa    schedule 08.09.2016
comment
если в категории нет статей, это должно предотвратить удаление категории. Если нет статей, должно быть разрешено удаление категории   -  person Neon_10    schedule 08.09.2016


Ответы (3)


Как указано в ответе на аналогичную проблему: https://stackoverflow.com/a/5520381/580346 вам необходимо верните true, если вы хотите, чтобы было вызвано уничтожение. Ваш ensure_has_no_articles всегда возвращает false. Ответ, предоставленный @sunil-bn, должен вам помочь.

Вам также может понравиться: Проверить перед уничтожением

person mrzasa    schedule 08.09.2016

Пытаться:

class Category

has_many :articles
before_destroy :ensure_has_no_articles

private

def ensure_has_no_articles
    return true if articles.count == 0
    errors[:base] << "cannot delete category that has articles"
    return false
end

Обновление:

class Category < ActiveRecord::Base
  has_many :articles, :dependent => :restrict_with_error
person Sunil B N    schedule 08.09.2016
comment
нет, это не работает, даже если я ставлю только return false без каких-либо условий. Я использую MongoDB, может ли это быть причиной моей проблемы? - person Neon_10; 08.09.2016
comment
какую версию рельсов вы используете? - person Sunil B N; 08.09.2016
comment
Я использую Рельсы 5. - person Neon_10; 08.09.2016

Этот метод устарел из-за этой проблемы с рельсами.

Лучший способ решить эту проблему

class Category

has_many :articles
before_destroy :ensure_has_no_articles

private

def ensure_has_no_articles
  unless articles.count == 0
    errors[:base] << "cannot delete category that has articles"
    throw(:abort)
  end
end
person Ndeto    schedule 12.02.2020