2009-07-14 18 views
17

私は2つのセクションにウェブサイトを分割しようとしています。 1つはアプリケーションレイアウトを使用し、もう1つは管理レイアウトを使用する必要があります。次のように私のapplication.rbでは、私は、関数を作成しました:Ruby on Rails - レンダリングのレイアウト

def admin_layout 
    if current_user.is_able_to('siteadmin') 
    render :layout => 'admin' 
    else 
    render :layout => 'application' 
    end 
end 

をそして、それは、1つまたは他のかもしれないのコントローラで私はこれが(ここで、そのわずか数ページのため正常に動作します

before_filter :admin_layout 

を置きますテキスト)ですが、他の人には古典的なエラーが表示されます:

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

私には何が欠けているのでしょうか?レンダリングとレイアウトを適切に使用するにはどうすればよいですか?

答えて

38

renderが実際にコンテンツをレンダリングしようとする方法。あなたがしたいときにそれを呼び出すべきではありませんレイアウトを設定しています。

Railsは焼きこのすべてのためのパターンを有しているだけで、現在のレイアウトを決定するために呼び出されるlayoutのシンボルとその名前のメソッドを渡します。

class MyController < ApplicationController 
    layout :admin_layout 

    private 

    def admin_layout 
    # Check if logged in, because current_user could be nil. 
    if logged_in? and current_user.is_able_to('siteadmin') 
     "admin" 
    else 
     "application" 
    end 
    end 
end 

See details hereを。

+1

? current_user.is_able_to( 'siteadmin') ログインしていないと、current_userがnilになることがあります。 –

+0

@Reuben、それは良い点です。追加されました。 – molf

+0

私はその行の前に他のチェックをして、ユーザーがログインしているかどうかをチェックしています。それは驚くべきことですが、レイアウト後に関数を呼び出すことは考えられませんでした。シンプルでとても役に立ちました。ありがとうございました。 – RyanJM

5

おそらく、ユーザーが最初にサインインしたことを確認する必要がありますか?

def admin_layout 
    if current_user and current_user.is_able_to 'siteadmin' 
    render :layout => 'admin' 
    else 
    render :layout => 'application' 
    end 
end 
+0

.nil? unless文が冗長であるのに、logged_inなら – Gav

1

ユーザがログインしていない場合、current_usernilである可能性があります。.nil?をテストするか、オブジェクトを初期化してください。 LOGGED_IN場合

0

はとmolfの答えをお試しください!そしてcurrent_user.is_able_to(「siteadmin」)

0

は、あなたの現在のユーザーは、ユーザーがログインした後にproperblyに設定されている。そして、この場合には、あなたが

よう

にログインしているかどうかを判断するためのオプションを持っている必要があります

if [email protected]_user.nil? 
    if @current_user.is_able_to("###") 
    render :layout => "admin" 
    else 
    render :layout => "application" 
    end 
end 

@current_userがnilでない場合は、if文だけを入力します。