Ruby on Rails - визуализация макета - PullRequest
19 голосов
/ 15 июля 2009

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

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

Ответы [ 5 ]

40 голосов
/ 15 июля 2009

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

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

5 голосов
/ 15 июля 2009

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

def admin_layout
  if current_user and current_user.is_able_to 'siteadmin'
    render :layout => 'admin'
  else
    render :layout => 'application'
  end
end
1 голос
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

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

как

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

Тогда он будет вводить оператор if, только если ваш @current_user не равен nil.

0 голосов
/ 15 июля 2009

Попробуйте ответ molf с:

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

...