Webサイトを2つのセクションに分割しようとしています。 1つはアプリケーションのレイアウトを使用する必要があり、もう1つは管理者のレイアウトを使用する必要があります。私のapplication.rbで、次のような関数を作成しました。
def admin_layout
if current_user.is_able_to('siteadmin')
render :layout => 'admin'
else
render :layout => 'application'
end
end
そして、それがどちらかであるかもしれないコントローラーに私は置きました
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
誰かが私が欠けているものについての考えを持っていますか?レンダリングとレイアウトを適切に使用するにはどうすればよいですか?
メソッド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
詳細はこちら 。
おそらく、ユーザーが最初にサインインしていることを確認する必要がありますか?
def admin_layout
if current_user and current_user.is_able_to 'siteadmin'
render :layout => 'admin'
else
render :layout => 'application'
end
end
current_user
は、ユーザーがログインしていない場合はnil
です。どちらかをテストして.nil?
またはオブジェクトを初期化します。
現在のユーザーは、ユーザーがログインした後に適切に設定されます。この場合、ログインしているかどうかを判断するオプションが必要です。
お気に入り
if !@current_user.nil?
if @current_user.is_able_to("###")
render :layout => "admin"
else
render :layout => "application"
end
end
次に、@ current_userがnilでない場合にのみ、ifステートメントを入力します。
次の方法でmolfの答えを試してください。
login_inの場合?およびcurrent_user.is_able_to( 'siteadmin')