1

これを支援できる人は誰もいませんか?

Rails3.2アプリでcancanを使用してレコードを見つけるのに問題があります。

'nas'インデックスで、current_userの場所に属する'nas'のリストを表示しようとしています。

問題は、ユーザーとnasの間に正式な関係がないことであるようです。場所がnasを所有し、ユーザーが場所を所有します。

NASコントローラーでaccessible_byメソッドを使用すると、異常な結果が得られます。私のability.rbで以下を使用すると、エラーが発生します:

 can :read, Nas, :locationusers => { :user_id => user.id }

 Error: undefined method `class_name' for nil:NilClass

そして、私がに変更した場合:

 can :read, Nas, :locations => { :user_id => user.id }

ユーザーの最初の場所のNASのみが表示されます。

たとえば、ユーザーがids = 1,2,3の場所を持っている場合、場所1のnasのみが表示されます。

cancanを使用して現在のユーザーの場所のすべてのNASを表示する方法はありますか、それとも別の方法で行う必要がありますか?

私の関係は次のとおりです。

 class User < ActiveRecord::Base
   ...
   has_many :locationusers
   has_many :locations, :through => :locationusers
   ...
 end


class Location < ActiveRecord::Base
  ...
  has_many :locationusers
  has_many :users, :through => :locationusers

  has_many :nas
  ...
end   

class Node < ActiveRecord::Base
  ...
  belongs_to :location
end

私のability.rbで:

...
if user.role? :customer_admins
can :read, Nas, :locations => { :user_id => user.id }
..

NasController

 @nas = Nas.accessible_by(current_ability).all
4

1 に答える 1

1

Cancanでは、ユーザーが王様です。ユーザーから許可しようとしているモデルに線を引くことができない場合、それは機能しません。Nas簡単な解決策は、 (この例のモデルはNode?)との間の関係をモデル化することですUserLocationuserこれは、既存のbelongs_toを使用してhas_many:throughとして(例には示されていません)経由で実行できます。

class Node < ActiveRecord::Base
  ...
  belongs_to :location
  has_many :locationusers, :through => :location
end

これで、Cancanability.rbで次を使用できます。

can :read, Node, :locationusers => { :user_id => user.id }

(モデルに正しく一致するNasように、例から変更しました)Node

于 2012-08-07T16:08:14.463 に答える