2011-06-11 10 views
1

現在、InheritedResources(最新バージョン)アプリケーションを使用してRails 3のコントローラからコードを再利用するためのモジュールをいくつか開発しています。InheritedResourcesで正常に作成または更新アクションを実行した後のアクション

私の考えは、リソースの作成や更新が正常に行われた後に実行する必要がある動作ですが、「作成」アクションまたは「更新」アクションを再宣言することを除いて、これに対処する方法についてはわかりません。

私は現在、私は他のものの間で、セッションへのリソースのIDを追加し、私が使用して特定のリソースを設定している

module SessionStorable 

    extend ActiveSupport::Concern 
    include Base 

    included do 
    before_filter :setup_resource, :only => :new 
    after_filter :reset_session_resource_id, :only => [:create, :update] 
    end 


    # .... 

end 

のようなものを使用しています。リソースがBDに正常に保存された後、セッションからIDを削除したいと思います。これがafter_filterの動作です。

これまでのところ、セッションにupdated_at情報を保存し、モデルが更新されたかどうかを比較して(正常な場合)、メソッドを実行することで対処しました。

しかし、私はそれに満足していません(またちょっとハッキー)。また、更新された後もリソースで動作する他のモジュールを用意する予定で、同じアプローチを使用したくない二度。

IRには使用する必要があるフックがありますか?または進行方法に関する他のアイデア?

+0

私はHTTPステータスコードの使用について考えていました。準備された要求が "200"か何か同様であればコードを適用するだけですが、そのアプローチのどちらかが確実でない場合(あるいは、とにかく動作する場合) – Yaraher

答えて

3

私が使用して、それを解決してきましたが調子。作成または更新アクションの後にオブジェクトにエラーがない場合は、モデルが正しく保存されたと想定してコードを実行すると問題はありません。

+0

ありがとう@Yaraher。 'object.valid?'も機能します。 – scarver2

2

たぶん、あなたではなく、継承ベースのアプローチを使用できます:「?object.errors.empty」

class BaseController < InheritedResources::Base 

before_filter :setup_resource, :only => :new 
after_filter :reset_session_resource_id, :only => [:create, :update] 

# ... 
end 

class YourController < BaseController 
# ... 
end 
+0

これは、他のアプリケーション間で共有されるべき動作を使用していることです。それ以上では、たとえリソースが保存されていなくても、after_filterは実行されます。(間違っているかどうかによらず、同じように) – Yaraher

+2

_ "object.errors.empty?"作成または更新アクションの後にオブジェクトにエラーがない場合、モデルが正しく保存されたと仮定するのが安全であることが必要です。 多くのメンバを持つProjectクラスを提供します。 フォームがあるとしますプロジェクトのためにメンバー(ネストされたフォーム)を作成することもできます。関連するメンバを作成する際にエラーが発生すると、プロジェクトオブジェクトは無効になりますが、エラーインスタンスメソッドの場合、プロジェクトインスタンスはtrueを返します。 – littlemove

2

コメント機能には申し訳ありませんが、私はあなたの回答に答えられないので、私は他の選択肢はありません。

"object.errors.empty?"調子。

を:作成または更新アクション後のオブジェクトにエラーがない場合、それはモデルが正しく、私は、これは常に真ではないと思う

に保存されたと仮定しても安全である必要があり、私はあなたとの例を入れてみましょう

class Project < ActiveRecord:Base 
    has_many :members 
    # ... 
end 

プロジェクト用のフォームがあり、そこにメンバー(ネストされたフォーム)を作成できるとします。関連するメンバーを作成する際にエラーが発生すると、プロジェクトオブジェクトが無効になりますが、プロジェクトインスタンスは、エラーの場合はtrueを返します。

+0

有効な前提のようです。このような振る舞いを必要とするコントローラーは影響を受けず、ネストされたフォームを使用しないため、私たちには影響しませんが、注意を払い、それを念頭に置くためのテストを追加します。ありがとう! – Yaraher

関連する問題