モデル例
- ユーザーは 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 を使用して達成できますか?