【问题标题】:rails 3 - accepts nested attributes for before destroy validationrails 3 - 在销毁验证之前接受嵌套属性
【发布时间】:2011-05-30 03:36:57
【问题描述】:

我有一个接受_nested_attributes_for klasses 的教师模型。如果 klass 中有用户并且我想打印验证消息,我不希望能够删除 klass。

这就是我所拥有的……

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”时,当我尝试从包含用户的教师中删除klass 时,我希望验证失败, "_destroy"=>"1", "id"=>"17183"} 哈希。

如果我没有 error.add_to_base 行,上述方法将防止 klass 被删除。但是,它不会导致显示验证消息。当我有那条线时,它不会阻止删除。

谢谢,

提姆

【问题讨论】:

    标签: ruby-on-rails-3 activerecord nested-attributes


    【解决方案1】:

    删除记录时不进行验证,仅在保存记录时进行。我在我的一个项目中处理此问题的方式是在模型中引发异常,然后在我的控制器中从该异常中解救并显示闪光警报。像这样:

    型号:

    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
    

    【讨论】:

    • 我没有调用destroy方法,我正在保存教师记录,其中可以包含已删除的klasses的哈希,这些klasses被accept_nested_attributes_for神奇地删除。例如。 "klasses_attributes"=>{"0"=>{"name"=>"test", "_destroy"=>"1", "id"=>"17183"}
    • 嗯,抱歉,我没有仔细阅读您的问题。我会重写我的答案...
    • 我更新了我的答案,但不是很干净。您应该在代码中添加一些 cmets,以明确发生了什么。我有兴趣看到更好的解决方案。祝你好运。
    • 谢谢米沙,这似乎是有道理的,但是当我尝试它时,我收到一条错误消息....取出 RuntimeError 块中的 e 参数并硬编码错误消息,我得到与以前相同的结果。即它不会删除 klass 但也不会产生验证错误。
    • 哦,是的,对不起,应该是RuntimeError =&gt; e。我猜你不能只通过add_to_base 添加一个错误并期望它显示出来。您保存的Teacher 记录也必须标记为无效。你可以按照我之前的建议做:拯救TeachersController 中的期望,并将错误显示为一条消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多