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

たとえば、この gem を含むアプリケーションは「qday」というレイアウトを指定します。パスに「baco」が含まれている場合、gem はレイアウトを変更する必要がありますが、含まれていない場合は「qday」をレンダリングする必要があります。

ありがとう!

4

2 に答える 2

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
  ...
于 2012-04-15T11:47:51.777 に答える
-1

試す:

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

ところで、Rails では、コーディングせずにコントローラーごとのレイアウトを使用できます。コントローラーにちなんで名前を付けますがcontroller、最後には付けずに( のようにusers.html.haml)、ディレクトリに配置します/views/layouts/。あくまでご検討の為…

于 2012-04-15T11:31:58.203 に答える