web-dev-qa-db-ja.com

Ruby on Rails-レンダリングレイアウト

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

誰かが私が欠けているものについての考えを持っていますか?レンダリングとレイアウトを適切に使用するにはどうすればよいですか?

19
RyanJM

メソッド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

詳細はこちら

40
molf

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

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

current_userは、ユーザーがログインしていない場合はnilです。どちらかをテストして.nil?またはオブジェクトを初期化します。

1
marcgg

現在のユーザーは、ユーザーがログインした後に適切に設定されます。この場合、ログインしているかどうかを判断するオプションが必要です。

お気に入り

 if !@current_user.nil?
   if @current_user.is_able_to("###")
     render :layout => "admin"
   else
    render :layout => "application"
   end
 end

次に、@ current_userがnilでない場合にのみ、ifステートメントを入力します。

0
Dee-M

次の方法でmolfの答えを試してください。

login_inの場合?およびcurrent_user.is_able_to( 'siteadmin')

0
Reuben Mallaby