Необходимо всегда использовать следующий синтаксис, чтобы повторно бросить исключение, еще Вы затопчете отслеживание стека:
throw;
при печати трассировки, следующей "из броска исключая" Вы будете видеть, что это заканчивается на том операторе а не в реальном источнике исключения.
В основном, это нужно считать уголовным преступлением для использования "броска исключая".
Метод 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
Тогда это будет вводить оператор if, только если ваш @current_user не равен нулю.
Попробуйте ответить molf с помощью:
if logged_in? и current_user.is_able_to ('siteadmin')