2011-12-19 22 views
1

私はこれを行う最善の方法を知りたいと思います。私はレイアウトについてRailsガイドを読んでいましたが、私はこれで少し困惑しています。複数のRailsレイアウト、または継承?

私はユーザーコントローラとセッションコントローラを持っています。ユーザコントローラは「サインアップ」に使用され、セッションコントローラは「サインイン」に使用されます。これらのコントローラは、ログインとサインアップ(accounts.html.erb)のレイアウトを同じにします。

サインインしたら、サインイン時に発生するすべてのもの(application.html.erb)に対して別のレイアウトをレンダリングします。私の問題は、Usersコントローラでは、私は 'show'アクションを持っています。これはユーザープロファイルです。これは、ユーザーがログインしているときだけ表示できますが、この 'show'アクションはaccounts.html.erbレイアウトを使用しています「作成」アクションと「新しい」アクション。私は 'show'アクションでapplication.html.erbを使用し、残りのアクションはaccounts.html.erbを使用するようにします。私は、この種のもののためのテンプレート継承を使用すべきか、このタイプのことを行う適切な方法は何ですか?

おそらくいくつかのコードも同様に役立ちます。

class UsersController < ApplicationController 
    layout 'accounts' 

def show 
    @user = User.find(params[:id]) 
    @title = @user.name 
end 

def new 
    @user = User.new 
    @title = "Sign up" 
end 

def create 
    @user = User.new(params[:user]) 
    if @user.save 
    sign_in @user 
    flash[:success] = "Welcome" 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render :action => "new" 
    end 
end 

エンド

答えて

2

をshowアクションはただでそれをレンダリングする「application.html.erb」を使用する必要がある。このコントローラで唯一のものである場合そのアクションの終わりにそのレイアウト。

render :layout => "application" 

あなたは少しより堅牢な何かを探している場合は、ユーザーがたりない署名されたかどうかに基づいてレイアウトを決定するためにあなたのapplication_controller.rbにメソッドを追加することができます。

class ApplicationController < ActionController::Base 
    ... 
    def determine_layout 
    if (signed_in) then 
     return "application" 
    else 
     return "accounts" 
    end 
    end 
    ... 
end 

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    @title = @user.name 

    render :layout => determine_layout 
    end 
end 

これの欠点は、両方のレイアウトを許可するアクションの最後にdecide_layoutを持たなければならないことです。アクションはすでにそのポイントによってレンダリングされているため、レイアウトを決定するためにafter_filterを追加することはできません。

+1

ああ、それは簡単ですか?私は、レイアウトではなく、そのアクションのための特定のテンプレートをレンダリングするためにのみ行うことができると思った...それは素晴らしいです! Jeffに感謝します。 – JeffC