レイアウトファイルの指定方法いろいろ。
メニュー表示のために、同じ内容のレイアウトを3ファイルも作っていた...。(app/views/layouts/user.rhtml、role.rhtml、permission.rhtml)これじゃDRYのルール違反。こんな場合は、application.rhtmlという名前でレイアウトファイルを作っておけば良いのだ。
Railsのレイアウトファイルの参照ルール
- コントローラーと同じ名前のファイル名をapp/views/layouts/フォルダに探しに行く。
- 例:softwares_controller.rbなら、softwares.rhtmlというレイアウトファイルを探す。
- 上記レイアウトファイルが存在しなければ、application.rhtml、またはapplication.rxmlを探しに行く。
layoutメソッド
- 上記ルールを超えて、コントローラーからlayoutメソッドで明示的に指定することも可能。
- app/views/layouts/engines.rhtmlをレイアウトファイルとして利用する。
class SoftwaresController < ApplicationController layout "engines"
- 特定のアクションの時だけ、指定することもできる。
- :list, :indexアクションの時だけ、app/views/layouts/engines.rhtmlをレイアウトファイルとして利用する。
- :list, :indexアクション以外は、softwares.rhtmlが存在しても、レイアウトなしの描画になる。
class SoftwaresController < ApplicationController layout "engines", :only => [:list, :index]
- ただし、このようの複数行に条件を分けても、最初の行の指定しか有効にならなかった...。
- :listアクションの時だけ、app/views/layouts/engines.rhtmlをレイアウトファイルとして利用する。
- :listアクション以外は、レイアウトなしの描画になる。
class SoftwaresController < ApplicationController layout "engines", :only => :list layout "login_engine", :except => :list
- 条件によってレイアウトを変更したい場合は、以下のようにメソッド定義の中で選択すれば良いことを知った。(2007-02-19)
- これなら、レイアウトの指定は一回だけで、思い通りの指定が可能になる!もっと頭を使うべきでした...。
class SoftwaresController < ApplicationController layout :select_layout def select_layout if action_name == 'list' "engines" else "login_engine" end end
renderのオプションlayout
- アクションごとにレイアウトを指定したい場合は、renderメソッドのオプションで指定する方法もある。
- :render :action => 'list'を描画する時に、app/views/layouts/engines.rhtmlをレイアウトファイルとして利用する。
- :render :action => 'show'を描画する時に、app/views/layouts/login_engine.rhtmlをレイアウトファイルとして利用する。
render :action => 'list', :layout => 'engines' render :action => 'show', :layout => 'login_engine'
- レイアウトを利用したくない場合は、falseを設定する。
render :action => 'list', :layout => false
レイアウトの優先順位
下記のように設定が競合していたら、renderのオプション設定が優先された。
class SoftwaresController < ApplicationController layout "engines", :only => :list def list render :action => 'list', :layout => 'softwares' end end
以上、Rails1.1.6でレイアウトファイルを試してみたメモ。