Rails: определение политики с помощью pundit, которая зависит от того, какую страницу посещает пользователь

У меня такой же партиал в рельсах, который требуется на двух страницах, где показан список постов. Первая - это страница новостной ленты, вторая - страница "Подробности".

В первом случае пользователь не должен иметь возможность редактировать, во втором он должен это делать.

Частичное что-то вроде этого:

<%= best_in_place_if policy(post).update?,
                     blahblah...
                     %>
<% end %>

Политика реализована так:

class PostPolicy < ApplicationPolicy
  include ActionView::Helpers::UrlHelper

  ...

  def update?
    ((@record.open? && not_blocked?) ||
    owner? ||
    collaborator?) &&
    !news_feed?
  end
  private

  def news_feed?
    current_page?(action: 'authenticated')
  end

  ...
end

Но кажется, что я не могу получить доступ к методу current_page?, Есть ли способ узнать из политики, какую именно страницу я посещаю?

Спасибо

2 ответа

Решение

Другое возможное решение может быть сделать это:

class PostPolicy < ApplicationPolicy
  # remove this: include ActionView::Helpers::UrlHelper
  ...

  def news_feed?
    ApplicationController.helpers.current_page?(action: 'authenticated')
  end

  ...
end

Посмотрите этот RailsCast и этот поток Stackru для получения дополнительной информации.

Классы Pundit не имеют доступа к вашим контроллерам, поэтому изначально вы не можете вызвать никакого помощника, который использует состояние контроллера или данные. Единственное решение, которое я вижу, это пройти action_name в качестве параметра для вашего метода политики

<%= best_in_place_if policy(post).my_method(action_name), ... %>

затем

class PostPolicy < ApplicationPolicy
  # Remove this: include ActionView::Helpers::UrlHelper

  def my_method(action_name)
    action_name == 'update' and ...
  end

end

редактировать

Я не чувствую себя хорошо, как использование ApplicationController.helpers.current_page? из-за рисков безопасности потоков на определенных веб-серверах, поэтому я советую передать параметр в метод вашей политики, чтобы устранить все риски

Другие вопросы по тегам