2

モデル例

  • ユーザーは 0..* カープールにいます
  • 各車は 1 つのカープールにあります
  • 各車のピックアップには1台の車があります

権限設定

can :read, Car, :car_pool => { :users => { :id => user.id } }
can :create, CarPickup

使用事例

目標は、ユーザーが自分の車の 1 つに新しい CarPickup を作成できるようにすることです。ビューは次のようになります。

= form_for @car_pickup do
  = f.association :car, :collection => Car.accessible_by(current_ability)

質問

ユーザーを保存するときは、現在のユーザーが上記のフォームで渡された車にアクセスできることを確認する必要があります。次の行に沿って何かを行うエレガントな方法はありますか:

def create
  @car_pickup = CarPickup.new(params[:car_pickup])

  authorize :create, @car_pickup

  if @car_pickup.car
    Car.accessible_by(current_ability).include?(@car_pickup.car)
  end

  if @car_pickup.save
  # ...
end

解決策の試み / さらなる質問

  • 次のように能力を適応させます。

    can :read, Car, :car_pool => { :users => { :id => user.id } }
    can :create, CarPickup, :car => { :car_pool => { :users => { :id => user.id } } }
    

    製品を選択せず​​にフォームを保存すると、これが壊れます。この解決策では、nil でないかどうかを指定する方法が必要です。

  • 2 番目の承認呼び出し:

    authorize! :read, @car_pickup.car if @car_pickup.car
    
  • 単一のレコードcan?(:read, @car_pickup)として理解できますか?accessible_by

  • これはおそらく load_resource を使用して達成できますか?

4

1 に答える 1