Вопрос по render, layout, ruby-on-rails – Ruby on Rails - визуализация макета

19

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

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

0

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

лайк

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

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

40

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

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

У меня есть другие проверки перед этой строкой, чтобы проверить, вошел ли пользователь в систему. Это удивительно, хотя я даже не думал о вызове функции после макета. Так просто и очень полезно. Спасибо. RyanJM
Для тех, кто проверяет это. Я должен был сделать немного больше исследований:apidock.com/rails/ActionController/Layout/ClassMethods/layout первый комментарий ответил бы на мой вопрос. RyanJM
если logged_in? и current_user.is_able_to («siteadmin») в качестве current_user может быть нулевым, если не войти в систему!
@ Reuben, это хороший момент; добавлено.
@ molf ссылка в вашем ответе не работает
0

Попробуйте ответить Мольфа с помощью:

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

5

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

def admin_layout
  if current_user and current_user.is_able_to 'siteadmin'
    render :layout => 'admin'
  else
    render :layout => 'application'
  end
end
.nil? на утверждение, если является избыточным, хотя

Похожие вопросы