2017-01-26 6 views
1

私はAuthenticatedControllerからすべて継承したコントローラをいくつか持っています(1つはPostsControllerです)。これらの子コントローラのそれぞれに多くの方法が同様のCRUD操作を実行して、バック要求リファラに継承されたメソッドでフラッシュハッシュを割り当てることはできますか?

をリダイレクト私は私のコントローラを枯渇したかったので、私はそのコードをリファクタリングしてdo_actionと呼ばれるAuthenticatedControllerに単一の方法でそれをすべて置きますオブジェクト、アクション、およびフラッシュメッセージを受け入れます。

class AuthenticatedController < ApplicationController 

    private 

    def do_action(action, obj, message, anchor='') 
     if obj.try(:action) 
      flash[:notice] = message 
     else 
      flash[:error] = 'Error Occurred' 
     end 
     redirect_to request.referer + anchor 
    end 

end 

class PostController < AuthenticatedController 

    def create 
     @post = Post.new 
     do_action(:save, @post, 'Created Successfully', "#post-#{@post.id}") 
    end 

end 

フラッシュメッセージが私のビューにもう表示されない点を除いて、素晴らしいです。

私が理解から
class PostController < AuthenticatedController 

    def create 
     @post = Post.new 
     do_action(:save, @post, 'Created Successfully', "#post-#{@post.id}") 
    end 

    private 

    def do_action(action, obj, message, anchor='') 
     if obj.try(:action) 
      flash[:notice] = message 
     else 
      flash[:error] = 'Error Occurred' 
     end 
     redirect_to request.referer + anchor 
    end 

end 

this SO questionを読んだ後、フラッシュがリクエストオブジェクトに委譲メソッドです:私はPostsControllerに戻すdo_actionを移動した場合

は、フラッシュメッセージが予想として表示されます。 のリクエストオブジェクトにアクセスできます。request.refererと思いますか?

AuthenticatedControllerのメソッドからフラッシュにメッセージを割り当てることができないのはなぜですか?

+0

あなたはこのようにしてはいけません。 私は問題がrequest.refererを使用していると思う、おそらくrequest.base_urlが良いでしょう。 – trueinViso

答えて

1

第一に、私はDRYがここに行く方法だとは思わない。あなたはそれを "レールの道"とすべきです。それはちょっと繰り返して、すべてのアクションにそれらのif @post.saveものがあります。それは傷つきません、本当に、あなたはそれを乗り越えるでしょう。

第2に、他の何かが間違っています。flashはどこにあるかに関係なく動作する必要があります。抽象化によっていくつかのバグが導入された可能性が高くなります。デバッガを使用して何が起こっているのか調べます。

+0

ありがとうございました、あなたは正しいと思っています。それ以外の何かが間違っていました。私のサーバーが再起動されていない可能性があります。今は期待どおりに働いています。 – chester

+0

「レールの道」という限りでは、私が抽象化したパターンは他に何があったのかに依存する下流のレールの規則はありません。私は、コンセプトを使用して、私(または他の誰か)がコードがどのように編成されているかを再学習する必要がないようにすることを考えています。しかし、この場合、アンカーでリダイレクトするなど、少しのロジックを追加したいときに、7つまたは8つの異なるコントローラを更新する必要がなくなります。 – chester

+0

あなたは自分の間違いから学ぶだけです。これがあなたのコードをより良くすると思うなら、私の意見であなたを止めるものは何もありません。 DRYはコードに適用する手段が最低限であることに留意してください。抽象概念を導入する前に2回考えてください。 – phoet

関連する問題