Определите, вызывается ли метод из представления или контроллера - PullRequest
0 голосов
/ 18 ноября 2011

в моем контроллере приложений у меня есть метод, чтобы проверить, авторизован ли текущий пользователь для действия. Я использую этот метод как из других контроллеров, так и из представлений. Как я могу определить, вызывается ли метод из представления или из контроллера?

Это необходимо, потому что ответ отличается (показывать предупреждение и перенаправление с контроллера, скрывать ссылку при просмотре). Возможно, я делаю что-то в корне неправильно, и мне следует решить это совершенно иначе?

Контроллер приложения:

  helper_method :is_allowed

    # Check if current user is allowed to perform action
  def is_allowed(required_level)
    # Required level is level and all levels above (1=high, 3=low)
    # level 1: user
    # level 2: company_admin
    # level 3: admin
    case required_level
        when 'company_admin'
            unless current_user.role == 'company_admin' || current_user.role == 'admin'
              flash[:alert] = I18n.t(:not_allowed)
              redirect_to root_path
            end
        when 'admin'
            unless current_user.role == 'admin'
              flash[:alert] = I18n.t(:not_allowed)
              redirect_to root_path
            end
        end
  end

Вызов с другого контроллера (это работает):

  before_filter :only => [:destroy] do |c| c.is_allowed 'company_admin' end

Вызов из вида (работает, но не должен перенаправлять, а только скрывать ссылку):

<% if is_allowed('company_admin') %>
  <td><%= link_to I18n.t(:delete), relation, :method => :delete, :confirm => I18n.t(:sure) %></td>
<% end %>

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Используйте отдельных помощников.

Контекст View отличается от контекста Controller. Смешивание этих контекстов нарушает шаблон MVC.

0 голосов
/ 18 ноября 2011

Проверка цепочки наследования self может работать:

case self
when ActionController then ...
when ActionView then ...
end

или, может быть, запрос self.is_a?(ActionController) или self.kind_of?(ActionController).

Дайте мне знать, как все обернется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...