2

Coupons2 つのアクションを持つコントローラーがあります。

class CouponsController < ApplicationController
  filter_resource_access

  def index
    @coupons = Coupon.all
  end

  #generates 10 new coupons on each call
  def generate
    plan_id = params[:plan_id]
    numdays = params[:num_days]

    (1..10).each do |i|
      validChars = %w{ 1 2 3 4 5 6 7 9 a A b B d D e E f g G h H j J k K m M n N p P q Q r R t T }.to_a

      code = (0...6).map{ validChars[ rand(validChars.size) ] }.join

      coupon = Coupon.new
      coupon.code = code
      coupon.plan_id = plan_id
      coupon.active = false
      coupon.subdays = numdays
      coupon.save
    end
    redirect_to :coupons_path
  end

end

私のビューでは、生成アクションが次のように呼び出されます。

<h2 class="page-title">Coupons</h2>
<div class="main">
   <%= form_tag "coupons/generate" do -%>
        <%= hidden_field_tag 'user[plan_id]', "1" %>
        <%= hidden_field_tag 'user[num_days]', "150" %>
      <%= submit_tag "Generate 10 Coupons!", :class => "primary button" %>
   <% end -%>
    <table border="0" class="list">
        <thead>
            <tr>
                <th>Code</th><th>Plan</th><th>Duration</th><th>Activated</th>
            </tr>
        </thead>
        <tbody>
        <% if !@coupons.nil? %>
            <% @coupons.each do |coupon| %>
            <tr class="<%#= list_entry or list_entry_alt %>">
                <td><%= coupon.code %></td>
                <td><%= coupon.plan_id  %></td>
                <td><%= coupon.subdays %> days</td>
                <td><% if coupon.started.nil? == true  %>
                    <%= 'Not yet' %>
                    <% else %>
                    <%= time_ago_or_time_stamp coupon.started %>
                    <% end %>
                    </td>
            </tr>
            <% end %>
        <% end %>
        </tbody>
     </table>
</div>

config/authorization_rules.rbはこのように見えます:

has_permission_on [:coupons], :to => [:index, :show, :step, :new, :create, :edit, :update, :destroy, :generate]

上記のスローのすべてのエラーは次のとおりです。

filter_access_to tried to find Coupon from params[:id] (nil), because attribute_check is enabled and @coupon isn't set, but failed: ActiveRecord::RecordNotFound: Couldn't find Coupon without an ID
Completed 404 Not Found in 245ms

ActiveRecord::RecordNotFound (Couldn't find Coupon without an ID):

ただし、をに変更するfilter_resource_accessfilter_access_to :all, :except => :generate、エラーは発生しなくなり、少し動作します。

つまり、探しているクーポン コードの一部が生成されますが、ビューの出力に plan_id 番号または日数が含まれていません。

何故ですか?私は何を間違っていますか?

編集1:ちなみに、それは適切な人を制限します...つまり、指定された役割のみがcoupons index view. したがって、フィルターは部分的に機能します。

4

5 に答える 5

2

filter_resource_access は、宣言型認証フレームワークをトリガーして、リソースの :id パラメーターでルックアップを実行します (コレクション/作成者以外のメソッドで)。

あなたの例では、 @coupon = Coupon.find(params[:id]) を実行し、コントローラーのメンバー変数を設定します。ただし、そのルートを介してそのアクションに入る params[:id] がないため、失敗します。

コントローラーのアクセス許可を維持しながら、それを回避する方法は非常に簡単です。これをコントローラの一番上にある filter_resource_access 行に置くだけです:

filter_resource_access :additional_collection => { :generate => :read } 
# I tried the two lines below but to no avail
#filter_resource_access :additional_collection => { :generate => :read }, :no_attribute_check => [ :generate ]
# filter_access_to :generate, :attribute_check => false

これにより、他のコントローラー アクションや「生成」アクションに対するアクセス許可チェックが維持されますが、「生成」メソッドは自動ファインダー ルックアップから除外されます。

詳細については、http: //rubydoc.info/github/stffn/declarative_authorization/master/Authorization/AuthorizationInController/ClassMethodsを参照してください。

于 2012-02-23T05:38:56.303 に答える
1

問題は、filter_resource_access を使用すると、コントローラがデフォルトのリソース アクションを使用すると想定し、params[:id] が標準のクラッドでないアクションの場合、ディーラーを見つけようとすることです。あなたがする必要があるのは追加することです

filter_access_to :all

そして、対応する :generate のルールを authorization_rules.rb に追加します。お気に入り

role :someone do
    has_permission_on :coupon, :to => :generate
    ...
end
于 2012-06-12T19:38:38.303 に答える
1

私の推測ではfilter_resource_access、コントローラー内のすべてのアクションを、単一のリソースを処理して実行しようとしているかのように扱っていますCoupon.find(params[:id])。これを次のように変更します。

filter_access_to :all, :except => :generate

そのアクションの前にそのメソッドを実行しないように指示しています。つまり、クーポンを見つけようとしません。

于 2011-08-26T06:57:52.163 に答える
0

filter_resource_access はリソース オブジェクトを作成しようとするため、:additional_memberまたは:additional_collectionオプションを確認するか、except指摘したようにオプションを使用する必要があります。

不足しているプラ​​ン パラメータについては、次のようになっていparams[:plan_id]ますか? 開発ログをチェックして、着信パラメーターがどのように見えるかを確認してください。

また、呼び出しの成功を確認していないsaveため、エラーが発生してもわかりません。

于 2011-09-02T04:20:31.470 に答える
0

宣言型承認では、クーポンをインスタンス変数として宣言する必要があります。

コントローラーで、次のように変更coupon = Coupon.newしてみてください@coupon = Coupon.new(もちろん、それに応じて後続の行を変更してください)。

于 2011-09-02T03:56:38.343 に答える