0

投稿のリストを表示する 2 つのページで必要な、レール内の同じパーシャルがあります。1 つ目はニュース フィード ページ、2 つ目は「詳細」ページです。

最初のものでは、ユーザーは編集できないはずですが、2 番目のものでは編集できるはずです。

パーシャルは次のようなものです。

<%= 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?。アクセスしている実際のページをポリシーから知る方法はありますか?

ありがとうございました

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 に答える