Rails:使用权威定义策略,该策略取决于用户访问的页面

时间:2014-07-01 07:00:18

标签: ruby-on-rails ruby-on-rails-3 current-page 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 个答案:

答案 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 RailsCastthis Stackoverflow thread