2012-04-15 20 views
3

私の宝石では、特定の条件でレイアウトを変更したいだけです。特定の条件でのみレイアウトを変更してください

私はレイアウトを指定するメソッドを持つことができますが、そのメソッドの現在のレイアウトをどのように指すことができますか?私は_layoutがレイアウト名を指していることを知りましたが、レイアウトを指定するメソッドでスタックオーバーフローが発生しました。

ここに(私のエンジンのアプリケーションコントローラで)明確化のために私のコードです:

layout :get_layout 

def get_layout 

    current = _layout # this is what I want, but causes a stack overflow 
    request.path_info.include?('/baco/') ? 'baco' : current 

end 

したがって、たとえば:この宝石を持つアプリケーションは、「qday」と呼ばれるレイアウトを指定し、今逸品場合、レイアウトを変更する必要がありますパスには 'baco'が含まれていますが、そうでない場合は 'qday'と表示されます。

ありがとうございます!

答えて

8

あなたは何をしようとしているように常にレイアウトを設定し、あなたがそれを変更したくない場合は、それがすでにだったものに設定します。代わりに、再帰のために、あなたの条件が成立している場合にのみ、レイアウトを設定すべきだと思います。

before_filter set_baco_layout 

def set_baco_layout 
    self.class.layout "baco" if request.path_info.include?('/baco/') 
end 

ただし、エンジンコントローラがそれぞれレイアウトを呼び出す場合は、よりクリーンな設計になります。

class Baco::BatsController < ApplicationController 
    layout "baco" 
    ... 

これはDRYと思われないかもしれませんが、ステップクリーナーです。

DRYの問題を修正するには、継承を使用しました。レイアウトを設定し、他のコントローラをベースから継承するベースコントローラクラスを用意してください。

class Baco::BaseController < ApplicaitonController 
    layout "baco" 
end 

class Baco::BatsController < Baco::BaseContoller 
    ... 
+0

素晴らしい、このメソッドは、私のために働く、ありがとう! jdoeにコメントされているように、コントローラごとの方法はこの状況で私のために働いていません。 2つのデバイスモデルを制御する1つのコントローラに2つのレイアウトが必要なためです。パス条件は、私が2つを分けるために見つけた唯一の方法です。 –

+0

同じコントローラに複数のレイアウトが必要な場合は、それを必要とするアクションに対して:layout => "baco"オプションを指定したメソッドでrenderを呼び出します。 –

+0

1) 'before_filter set_baco_layout' - ' set_baco_layout'はシンボルでなければなりません。 2) 'self.class.layout'を使うと巨大な落とし穴になります。レイアウトを設定すると、URLに' baco'がなくてもさらに使用されます - 誰がデフォルトにリセットするのでしょうか? – jdoe

-1

試してみてください。

before_filter only: [:index, :show, :edit, :new] do 
    render layout: 'baco' if request.path_info.include? '/baco/' 
end 

ところで、Railsはあなたがコーディングなしごとのコントローラのレイアウトを使用することができます。あなたのコントローラーにちなんで名前をつけて、最後にcontrollerusers.html.hamlのような)をつけずに/views/layouts/ dirに入れてください。ちょうど考慮のため...

+0

大きな方法!以前のフィルタにはもっと多くのユーザビリティがあります。コントローラーメソッドをありがとうございますが、bacoパスは開発者adminsパスであり、条件は管理者とユーザーのために異なるレイアウトをレンダリングするために使用されます両方ともdeviseコントローラを使用しています。 –

+0

テストの結果、少し問題がありました。私のdevise/sessions/createビューがもう見つからないことがわかりました。 –

+0

あなたはフィルタの制約について知らないと思います。私は答えを変えた。今すぐチェックしてください。 – jdoe

関連する問題