0

、 、およびモデルがUserありProductますSubscription。基本的に、サブスクリプションは特定の製品に対するものであり、製品は複数のサブスクリプションを持つことができ、各製品はユーザー (つまり、作成者) に属します。ユーザーは、管理者または通常のユーザーです。

私の質問は、通常のユーザーが自分が作成した製品のサブスクリプションのみを作成できるようにしたい場合、cancan を使用してこれをどのように実装すればよいですか?

これは、現在私のability.rbにあるものです。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user
      if user.admin?
        can :manage, :all
      else # not an admin
        can :read, User
        can :manage, User, id: user.id
        cannot :create, User

        can :read, Product
        can :manage, Product, user: user

        can :read, Subscription
        # this is sort of what I want, but now nobody can create subscriptions
        can :create, Subscription, product: { user: user }
        can :manage, Subscription, product: { user: user }
      end
    else # not a user, just a guest
      can :create, User
      can :read, User
      can :read, Product
      can :read, Subscription
    end
  end
end

私はこれについて完全に間違っていますか?コントローラーでこれを行うか、代わりに何らかの検証を使用する必要がありますか?

4

1 に答える 1

2

CanCan は、問題に対する正当な解決策です。

コントローラーでこれを行うべきかどうかを尋ねると、答えは、コントローラー内で CanCan パーミッションを使用して、特定のユーザーが要求されたアクションを実行できるかどうかを確認する必要があるということです。

通常、コントローラーを呼び出すことでこれを実現authorize_resourceしますが、代わりに を使用することもできますauthorize! :create, @subscription

さらに、権限のないアクションへのリンクをユーザーに提供しないことで、ユーザーを助けることができます。

あなたの見解では、次のようなことができます:

<% if can? :create, @product.subscriptions.build %>
  <%= link_to new_product_subscription_path(@product) %>
<% end %>

それとは別に、ability.rb ファイルには小さな問題が 1 つあります。

can :manage, Subscription, product: { user: user }

する必要があります

can :manage, Subscription, product: { user_id: user.id }

少なくとも、それが CanCan wiki ページで文書化されている方法です。

これは私が望んでいることの一種ですが、今では誰もサブスクリプションを作成できません。

サブスクリプションを承認する前に、そのサブスクリプションに product_id があることを確認しましたか?

product_id がないと、その製品に依存しているため、サブスクリプションの承認は失敗します。

@product.subscriptions.buildの代わりに書くことで、product_id があることを確認できますSubscription.new。load_and_authorize_resource を使用する場合は、https://github.com/ryanb/cancan/wiki/Nested-Resourcesに示すように、ネストされたバリアントを使用してください。

于 2013-04-09T13:39:47.957 に答える