【问题标题】:Condition in before_destroy callback (Rails) does not workbefore_destroy 回调(Rails)中的条件不起作用
【发布时间】:2017-01-16 02:52:25
【问题描述】:

before_destroy 过滤器中的条件 "unless articles.count == 0" 不起作用。

有没有人遇到过类似的问题?

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

【问题讨论】:

  • “不起作用”是什么意思?您期望的行为是什么,您观察到的行为是什么?
  • 如果Category没有文章,它应该防止分类删除。如果没有文章,它应该允许删除类别

标签: ruby-on-rails callback destroy


【解决方案1】:

试试:

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

【讨论】:

  • 不,即使我在没有任何条件的情况下只返回 false,它也不起作用。我使用 MongoDB,会不会是我的问题?
  • 您使用的是哪个版本的导轨?
  • 我使用 Rails 5。
【解决方案2】:

如对类似问题的回答中所述:https://*.com/a/5520381/580346 如果您希望调用销毁,则需要返回 true。你的ensure_has_no_articles 总是返回false。 @sunil-b-n 提供的答案应该对您有所帮助。

您可能还喜欢:Validate Before Destroy

【讨论】:

    【解决方案3】:

    根据this rails issue,此方法已被弃用

    解决这个问题的最佳方法

    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
    

    【讨论】: