Какой самый Rails-способ обработки нескольких макетов / представлений для одного и того же действия контроллера? - PullRequest
2 голосов
/ 15 сентября 2010

Сценарий таков:

У меня есть несколько пользователей на моем сайте. У пользователя есть роль, здесь уместны admin и normal. У меня тоже есть модель, назовем ее SomeModel.

Я создал бэкэнд для сайта, который использует макет admin . Все администраторы имеют полный доступ для редактирования любого контента.

Проблема возникает с этим отношением: Пользователь -> владеет -> SomeModel . Это означает, что не администратор Пользователь может владеть экземпляром SomeModel и должен иметь возможность редактировать данные этого экземпляра.

Контроллер для SomeModel имеет действие редактирования, которое обслуживает как администраторов, так и обычных пользователей.

Тем не менее, я не хочу, чтобы обычные пользователи просматривали макет admin и сейчас, как я это делаю, выглядит так:

if current_user.admin?
  render :layout => 'admin'
end

По умолчанию используется стандартная схема, если пользователь не является администратором. У меня есть это во всех моих действиях для SomeModel, и это просто не похоже на очень Rails-способ действий.

Есть ли лучший способ?

1 Ответ

4 голосов
/ 15 сентября 2010

Вы можете сделать это на уровне контроллера:

  class MyModelController < ActionController::Base
    layout :user_or_admin_layout

    def index
      # fetching objects
    end

    private
      def user_or_admin_layout
        current_user.admin? ? "admin_layout" : "user_layout"
      end
  end

В документации рельсов есть еще примеры для layout

...