1

私がやろうとしているのは、特定のモデルを破棄できない場合に、例外ではなくエラーを返すことです。現在、それは発生ActiveRecord::DeleteRestrictionErrorしますが、それはフラッシュメッセージに返されたり、モデルのエラーコレクションに追加されたりしません。

私がやったことは、私の機知に富んだコントローラーでこれをセットアップすることです:

  def destroy
    begin
      resource.destroy
    rescue ActiveRecord::DeleteRestrictionError => e
      resource.errors.add(:base, e)
    end
  end

この特定の動作を必要とするすべてのコントローラー内でこれを管理したくありません。どうすれば抽象化できますか?のdestroyメソッドを上書きするのは良い考えでActiveRecord::Baseはありませんが、落とし穴はないのではないでしょうか。

私はinherited_resourcesgemを使用しているので、それを拡張することでこれに答える方法があるのではないでしょうか。

私が持っていたもう1つのアイデアは、(ここから:ActiveRecord :: Baseを拡張するRailsActiveRecord::Base )を使用して拡張し、モデルごとにdestroyメソッドをカスタムdestroyに委任することでした。考え?ActiveSupport::Concern

4

2 に答える 2

2

まず、destroyのようなActiveRecord::Baseメソッドをオーバーライドしないという態度に同意します。この動作を乾燥させるために、いくつかのオプションがあります。そのうちの2つをリストします。

1つ目-特定のコントローラーにrescue句を記述する代わりに、それをApplicationControllerに埋め込んで、アプリケーション全体の動作を実現できます。

# ApplicationController.rb

rescue_from ActiveRecord::DeleteRestrictionError do |exception|
  resource.errors.add(:base, exception) if resource
end

もう1つのオプションは、モジュールを作成し、この動作を実現するさまざまなコントローラーにモジュールを含めることです。

module SafeDestroyer
  def safe_destroy(resource)
   begin
      resource.destroy
    rescue ActiveRecord::DeleteRestrictionError => e
      resource.errors.add(:base, e)
    end
  end
end

class MyController < ApplicationController
  include SafeDestroyer

  def destroy
    safe_destroy(resource)
  end

end
于 2012-11-04T12:38:54.457 に答える
0

私がやったことは、マスターリソースコントローラーからコントローラーを継承することでした。これは、説明した他のオプションよりもはるかにクリーンで強力であることがわかりました(ここにあります:http://roberto.peakhut.com/2010/09/27 / admin-controllers-with-inherited-resources /)。

// controllers/resources_controller.rb
class ResourcesController < ApplicationController
  load_and_authorize_resource
  inherit_resources

  def destroy
    begin
      resource.destroy
    rescue ActiveRecord::DeleteRestrictionError => e
      resource.errors.add(:base, e)
    end
  end
end

次に、ApplicationControllerではなく、このコントローラーからリソースの豊富なコントローラーを継承します。

// controllers/models_controller.rb
class ModelsController < ResourcesController

end

それが同じような状況で誰かを助けることを願っています。

于 2012-11-04T13:09:11.347 に答える