CanCan uprawienie dla nie standardowej akcji

Gem “cancan”, “authlogic”

albums_controller

def delete_multiple @album = Album.find(params[:albums_ids]) @album.each do |album| album.destroy end flash[:notice] = "#{@album.count} Albums were destroyed" redirect_to :back end
tablica albums_ids jest tworzona poprzez zaznaczanie checkboxow

<%= check_box_tag “albums_ids[]”, album.id %>

Chcialbym zeby grupa uzytkownikow mogla usuwac jedynie swoje albumy.

Ability.rb

if user.role? :user can [:update,:destroy] , Album do |album| album.user.try(:user) == user end
Ten kod powoduje ze uzytkownik moze usuwac jedynie swoje albumy ale poprzez akcje destroy. Generalnie jezeli blok w pliku ability.rb zwraca true dana grupa moze uzywac akcji

W konsoli takie cos dziala

@u = User.find(8)
@a = Album.find(40)

@u.album_ids
=> [40, 45, 55, 56, 57, 59, 61, 62, 71, 72, 73, 74, 77, 78, 79]

@a.id
=> 40

@u.album_ids.include?(@a.id)
=> true

Niestety nie wiem w jaki sposob moge przeslac tablice albums_ids do ability.rb

Wydaje mi się, że prościej w kontrolerze Albums jest zrobić finda takiego typu i wrzucić go do before_filter przy odpowiednich akcjach:

def find_album @album = current_user.albums.find_by_sth!(blablabla) end

Jak album nie istnieje lub nie należy do usera, to zwróci RecordNotFound.

Polecam: http://railscasts.com/episodes/178-seven-security-tips

@lewy looknij na:

http://github.com/ryanb/cancan/wiki/Custom-Actions i http://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers

Tam znajdziesz odpowiedź na nurtujące Cię pytanie. :slight_smile:

[quote=oki]@lewy looknij na:

http://github.com/ryanb/cancan/wiki/Custom-Actions i http://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers

Tam znajdziesz odpowiedź na nurtujące Cię pytanie. :)[/quote]
ability.rb

can :delete_multiple, Album do |album| user.album_ids.include?(album.id) end

<%if can? :delete_multiple, album%> <label><%= check_box_tag "albums_ids[]", album.id %></label> <%end%>
Teraz checkboxy pokazuje sie jedynie przy albumach stworzonych przez zalogowanego uzytkownika. Niestety kiedy proboj cos usunac dostaje

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

Oczywiscie bez autoryzacji wszystko usuwa sie poprawnie