0

我在两页中需要相同的部分导轨,显示帖子列表。第一个是新闻提要页面,第二个是“详细信息”页面。

在第一个中,用户不应该能够编辑,在第二个中他应该能够。

部分是这样的:

<%= 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

但似乎我无法访问 method current_page?。有没有办法从政策中知道我正在访问的实际页面是什么?

谢谢

4

2 回答 2

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?,因此我建议将参数传递给您的策略方法以消除所有风险

于 2014-07-03T12:32:43.183 回答
1

另一种可能的解决方案可能是这样做:

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

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

  ...
end

有关更多信息,请参阅此 RailsCast此 Stackoverflow 线程

于 2014-07-03T15:02:14.303 回答