Dynamiczne przekazanie atrybutu dla filtra

Witam, chciałbym przy pomocy cancana zrobić coś takiego

[code=ruby]class PostsController < ApplicationController

load_and_authorize_resource through: @postable_type[/code]
@postable_type zależało by od parametru przekazanego w params. Czy to dobre podejście i jak ustawić tą zmienną ?

https://github.com/ryanb/cancan/wiki/Nested-Resources oraz reszta wiki, tylko tak sie da z tego co wiem, ale jest calkiem ok grupa dyskusyja jak by co Rayan odpowie albo tweeter, tez odpisuje

w sumie to nie jest pytanie tylko odnośnie cancana tylko jak przekazać tą zmienną, jeśli wstawiam symbol np :project to wszystko działa ok

Zmienna na etapie wykonywania się linijki load_and_authorize_resource through: @postable_type nie jest zdefiniowana, więc to działa tak, jakbyś napisał ``load_and_authorize_resource through: nil`.

Pamiętaj, że definicja klasy jest kodem normalnie wykonywanym przez rubiego. Nie znam cancana, ale może możesz zamiast symbolu przekazać blok kodu? W nim zmienna instancji będzie “pobrana” rzeczywiście w momencie wykonania odpowiedniego czegoś, a nie na etapie startowania serwera.

load_and_authorize_resource through: lambda { |c| :project }

wywala niestety: … is not allowed as an instance variable name

Znaczy, ja bym szukał w dokumentacji cancana.

Problem rozumiesz: zmienna bezpośrednio wpisana w kodzie wykonującym sie podczas definicji klasy jest zupełnie inną zmienną, niż ta ustawiana dla instancji tej klasy przez jedną z jej metod w momencie obsługiwania konkretnej akcji kontrolera (czyli wtedy, gdy istnieje obiekt params).

Teraz tylko pytanie, czy oni przewidzieli taki scenariusz, którego potrzebujesz. Zazwyczaj robi się tak, że takie makra używają symbolu do znalezienia metody a nie zmiennej, więc w takich przypadkach jest łatwiej.

Ale zaraz, chwila! Przecież podajesz tu nazwę zmiennej. Dowolną! Któryś z Twoich filtrów może przecież tę zmienną dowolnie ustawić, na podstawie czegokolwiek, więc w czym problem?

jak już nic lepszego się nie uda, to może spróbuj

[code=ruby]before_filter :load_and_authorize_through_type

def load_and_authorize_through_type
@postable_type = params[:type]
self.class.load_and_authorize_resource through: @postable_type.to_sym
end[/code]