我在两个页面中有相同的部分导轨,显示了一个帖子列表。 第一个是新闻提要页面,第二个是"详细信息"页。
在第一个用户不应该编辑,在第二个他应该能够编辑。
部分是这样的:
<%= 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?
。有没有办法从政策中了解我访问的实际页面是什么?
谢谢
答案 0 :(得分:2)
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
修改强>
由于某些Web服务器存在线程安全问题的风险,我感觉不像使用ApplicationController.helpers.current_page?
,所以我建议将参数传递给您的策略方法以消除所有风险
答案 1 :(得分:1)
另一种可能的解决方案可能是这样做:
class PostPolicy < ApplicationPolicy
# remove this: include ActionView::Helpers::UrlHelper
...
def news_feed?
ApplicationController.helpers.current_page?(action: 'authenticated')
end
...
end
有关详情,请参阅this RailsCast和this Stackoverflow thread。