レイアウトファイルの指定方法いろいろ。

メニュー表示のために、同じ内容のレイアウトを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でレイアウトファイルを試してみたメモ。