1

私はこのようなモデル構造を持っています。

User
 |
 +-- Order
      |
      +-- OrderItem
           |
           +-- OrderItemNote

Order は User と直接関係があるため:user_id => user.idAbilityクラスでUser.role? :customer(たとえば) 自分の注文を編集できるようにすることができます。

ただし、:user_id列を追加するだけOrderItemOrderItemNoteはなく、ユーザーが自分のオブジェクトOrderItemOrderItemNoteオブジェクトを編集できるように CanCan を構成する方法がわかりません。

誰でも助けてもらえますか?

アップデート:

私はRailsAdminを使用しているため、jvnillの回答を使用しました(そして、よりもAbilityクラスを実行する方が簡単ですload_resource。通常の状況では、CanCanのload_resourceほうが良い方法です。

注: ネストの最初のレベルは次によって処理されます。

can :manage, OrderItem, order: { user_id: user.id }

より深いレベルのネスト...:

can :manage, OrderItemNote, order_item: { order: { user_id: user.id } }

... SQL エラーをスローしました

no such column: order_items.orders

そして、CanCan は、モデルを通じてではなく、より深いレベルの参照 (つまり、この場合) をデータベース フィールド参照として扱うようです(実際のデータベース フィールド以外のものを提供するために、仮想属性などを使用していくつかorderのトリックを試しました)。名前が認識されません。) - これをさらに調査する時間が限られています。後で調べることができるように、自分用にこれらのメモを残しておきます。order_iduser_id

最終的に、より深いレベルのネスティングは不要であると判断し、注文アイテム自体にメモを含めたので、モデルは次のようになります。

User
 |
 +-- Order
      |
      +-- OrderItem (which includes a note)
4

2 に答える 2

2

すべての中間オブジェクトをロードすることが理にかなっていて、ルートを適合させている場合 (つまり、必要なすべての ID を使用している場合):

class OrderItemNotesController
  load_resource :order,           through: :current_user
  load_resource :order_item,      through: :order
  load_resource :order_item_note, through: :order_item

この方法では、機能は必要ありません。すべてのオブジェクトは関連付けを通じて取得されます。

もちろん、実際に状況に適応する必要があります(load_and_authorize_resource必要に応じて、まだできることを忘れないでください)

于 2013-02-20T11:24:33.727 に答える