Подтвердить что ты не робот

Ruby on Rails - макет рендеринга

Я пытаюсь разделить веб-сайт на два раздела. Один из них должен использовать макет приложения и тот, который должен использовать макет администратора. В моем приложении .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

Есть ли у кого-то представление о том, что мне не хватает? Как правильно использовать рендер и макет?

4b9b3361

Ответ 1

Метод 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

Подробнее см. здесь.

Ответ 2

возможно, вам нужно проверить, что пользователь первым подписал?

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

Ответ 3

Возможно, это связано с тем, что current_user nil, когда пользователь не вошел в систему. Либо проверьте для .nil?, либо инициализируйте объект.

Ответ 4

Попробуйте ответить molf с помощью:

если logged_in? и current_user.is_able_to ('siteadmin')

Ответ 5

Ваш текущий пользователь правильно настроен после того, как пользователь вошел в систему. В этом случае у вас должна быть опция для определения того, вошли ли вы в журнал

как

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

Затем он будет вводить только оператор if, если ваш @current_user не равен нулю.