2011-08-09 9 views
0

だから私は、サブコントローラのものと同じスーパーコントローラのメソッドを持っています..アイテムが保存されない場合は、すべてリダイレクト_toを除いてすべてRoR:スーパーとサブのクラス分けコントローラ

サブクラスのメソッド:

def create 
some logic 
respond_to do |format| 
     if @template_object.save 
     format.html { redirect_to({:controller=>:template_objects,:action=>:build,:id=>@template_object}) } 
.. 
end 

スーパー方法:

def create 
some logic 
respond_to do |format| 
     if @template_object.save 
     format.html { redirect_to({:controller=>:objects,:action=>:build,:id=>@object}) } 
.. 
end 

これについて移動する最良の方法は何ですか?

答えて

1

あなたはスーパークラスとサブクラスの両方でredirect_toを持っていますか?その場合、セッション変数のようなフラグを使用して、スーパークラスでredirect_toを使用するかスキップするかを決定する必要があります。

deviseは、たとえばdeviseを使用してサインインした後に特定のページにリダイレクトする必要がある場合など、同様の手法を使用します。

あなたのスーパークラス

def method 
    ...some logic... 
    if !session[:redirect_var].nil? 
     session.delete :redirect_var 
     redirect_to .... 
    end 
end 

あなたのサブクラス

def method 
    session[:redirect_var] = 'skip_redirect' # or whatever, just create a session variable to use as a flag 
    super 
    ...some method... 
    redirect_to .... 
end 
1

通常の「オブジェクト指向」これまでのアプローチは、それらのそれぞれで異なってそれを定義、両方が呼び出すことができるメソッドを作成することです:

def redirect_to_completed_template(template_object) 
    redirect_to(...) 
end 

アイデアは、サブクラスが再できるようにすることです必要な機能の一部のみを定義します。このため、機能が特に複雑ではなくても、機能として分割された特定の機能を頻繁に見ることになります。

+0

これは私のものよりもはるかにエレガントな解決策であるように思われます。実装方法を詳しく教えてください。 ** redirect_to_completed_template **に何を渡しますか?私はこれを使うことを学びたいと思います。 – rookieRailer

+0

オブジェクトを渡します。あなたの場合、 '@ object'または' @ template_object'のように見えます。 'redirect_to'行はそれに応じてどちらか一方になります。 – tadman

+0

お返事ありがとうございました。 – rookieRailer

関連する問題