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?
из-за рисков безопасности потоков на определенных веб-серверах, поэтому я советую передать параметр в метод вашей политики, чтобы устранить все риски