私はcancancan宝石における役割の能力(レール5、postgresの、工夫を)宣言した:cancancan行ベースのフィルタ
can [:update, :show, :destroy, :index], SalesDatum do |datum|
datum.try(:user_id) == user.id #the ids just access the id's from the user object that is passed into can can and from the table
end
SalesDatum
はuser_id
フィールドがあります。
私は例えばuser_id
にログインしただけshow
SalesDatumことができるので、これは、ショーのアクションで動作します:user_idのログインがSALES_DATA
http://localhost:8080/projects/19/sales_data/961 が正しく認証され
http://localhost:8080/projects/19/sales_data/800 ログインしたuser_idがsales_dataのuser_idと一致しないため、正しく認証されません
しかし、私がgeに行くとtインデックスアクション: http://localhost:8080/projects/19/sales_data @sales_data
変数からのすべての売上データが表示されます。だから、それはdata.id 800と961
販売データコントローラを示すだろう。
load_and_authorize_resource
def index
@sales_data = SalesDatum.where(project_id:params[:project_id])
end
にはどうすればindexアクションが唯一の関連のuser_idでデータを表示するのですか? cancanはフィルタリングすることはできませんuser_id
によると?
コントローラのクエリを 'SalesDatum.where(project_id:params [:project_id])。(user_id:' current_user.id') 'に編集することはできますが、これは本当に貧弱な認証方法のようです。 – HoosierCoder
これは私がCanCanCanを放棄してPunditを捨てた理由です。信じられないほどシンプルなDSLは、認証スコープの定義や何か重要な処理をうまくやっていません。 – max