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
Есть ли у кого-то представление о том, что мне не хватает? Как правильно использовать рендер и макет?
Ответы
Ответ 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 не равен нулю.