Role użytkowników oraz typy abonamentu

Witam
Chciałbym poradzić się co do wyboru pluginu lub taktyki w aplikacji z ankietami. Serwis miałby zawierać dwa typy użytkowników, tutaj pewnie jakis prosty plugin do ról by sie sprawdził, były by to role user i guest. Dodatkowo każdy użytkownik i gość (dla wersji demo) może mieć różne typy abonamentu jak np. darmowy, rozbudowany, pro. Abonament ma decydować do jakich opcji serwisu użytkownik ma dostęp podczas jego trwania, np niektóre typy pytań czy np szablony były by dostępne tylko dla danego typu abonamentu. Nie chodzi więc o sam dostęp do kontrolerów i klas ale także do pewnych opcji wewnątrz akcji. Czy warto abonament rozbic na dodatkowa tabele np Subscriptions czy też w Users ustawiać ? A może i to i to?

Ja zostawiam abonamenty w oddzielnych tabelach bo czesto to cos wiecej niz nazwa i cena.

W sumie racja, pasuje zapisać kiedy zapłacony i do kiedy. A jaki prosty gem by spasował dla tych ról user i guest ? Podejrzewam że do samego abonamentu nie ma gemu jako tako, chyba zeby uzyć dwóch gemów do ról różnych, jeden do tego a drugi do tego ? Tylko nie wiem czy to nie przegięcie troche.

Mi się podoba plugin easy_roles.

Patrzyłem, w nim za bardzo nie da się nic zrobic poza ustawieniem ról. CanCan wydaje mi się interesujący tylko nie wiem jak w nim ustawić i czy się w ogóle da, żeby np dana rola pozwalała na ustawienie atrubutu w danym obiekcie a inna nie. Np wywołuje sobie User.can_set_something?

Udało mi się z grubsza uzyskać to co chcę używając dwóch pluginów http://github.com/nakajima/roleful i http://github.com/platform45/easy_roles. Roleful pierwszy umożliwia ustawienie can :costam ale nie doszukałem się w nim jak ustawiać same role bez tworzenia nowego użytkownika, ale za to Easy Roles to ma. trza było tylko dodać do User

def role self.roles end
żeby Roleful mógł odczytać to co easy_roles ustawił. Nie wiem czy to optymalne rozwiązanie, najlepiej by było jakby się dało jednym pluginem. CanCan ?

a może acl9?

[code=ruby]#ustawiasz rolę:
User.has_role! :foo
#lub opcjonalnie - nadajesz rolę foo dla obiektu bar
User.has_role! :foo,bar

#sprawdzasz czy posiada rolę foo
User.has_role? :foo[/code]

Też o nim czytałem, wygląda nieźle. Obawiam się że może być zbyt rozbudowany jak na moje potrzeby, ma min osobną tabele na role, a nie będzie ich wiele, jeden użytkownik będzie miał jedną maks dwie role i do tego po pare akcji can cośtam. Jeśli to co mam okaże się wadliwe albo niewystarczające to pewnie zastanowię się nad Acl9 także

Ryan Bates (od Railscasts) nasmarował ostatnio prosty gem do ról: http://github.com/ryanb/cancan

Używałem w jednym małym projekciku i działa świetnie, do tego nie przeraża mnóstwem parametrów.

ja próbowałem acl9 fajny jest, ale http://github.com/stffn/declarative_authorization jak dla mnie jeszcze lepszy, a że za bardzo rozbudowany ? kwestia gustu.
W dziale z nowymi projektami zdaje się webpraca tego używa.

[quote=hubertlepicki]Ryan Bates (od Railscasts) nasmarował ostatnio prosty gem do ról: http://github.com/ryanb/cancan

Używałem w jednym małym projekciku i działa świetnie, do tego nie przeraża mnóstwem parametrów.[/quote]
Fajne jest tam to że można przypisać ability (mozliwość) do danego obiektu, ale czy da się dla danej roli ustawić możliwość zrobienia czegoś bez powiązania z konkretnym kontrolerem czy akcją i ustawić własną ability, np. @user.can_do_something? i użyć to np w widoku. Acl9 z tego co widzę chyba ma coś takiego, ostatnie przykłady z readme

[code=ruby] <% if show_settings? %>
<%= link_to ‘Settings’, settings_path %>
<% end %>

<% show_to :prince, :of => :persia do %>
<%= link_to ‘Princess’, princess_path %>
<% end %>[/code]
obawiam się tylko że to kobyła której 90% ficzerów i tak nie użyje a pamięc zajmie :slight_smile:

krzyzak: dziala ci metoda user.roles w acl9, bo u mnie daje undefinied method, chyba ze coś sknociłem przy instalacji. Chwilowo używam zamiast tego current_user.role_objects.each.map {|r| r.name} jeśli chcę dostać tablicę ról dla użytkownika

u mnie tak samo- co też kiedyś zastanawiałem się dlaczego to nie działa, ale w sumie potem tego nie potrzebowałem, więc nei przejmowałem się tym- ale może warto zgłosić to jako buga.

właśnie zgłosiłem, możesz podbić w kolejce http://github.com/be9/acl9/issues#issue/24

[quote=Artur79]Fajne jest tam to że można przypisać ability (mozliwość) do danego obiektu, ale czy da się dla danej roli ustawić możliwość zrobienia czegoś bez powiązania z konkretnym kontrolerem czy akcją i ustawić własną ability, np. @user.can_do_something? i użyć to np w widoku. Acl9 z tego co widzę chyba ma coś takiego, ostatnie przykłady z readme

[code=Ruby] <% if show_settings? %>
<%= link_to ‘Settings’, settings_path %>
<% end %>

<% show_to :prince, :of => :persia do %>
<%= link_to ‘Princess’, princess_path %>
<% end %>[/code]
[/quote]
CanCan tego nie ma, ponieważ nie zapisuje on ról jako osobnych rekordów w bazie (jak to robi acl9) - to, w jaki sposób będzie pobierana informacja o tym, czy user jest adminem, czy moderatorem, czy jest właścicielem danego postu itd. zależy tylko od Ciebie. Warto obejrzeć cały screencast.

W acl9 też da się zrobić tak, by rola użytkownika była zapisywana w jednym miejscu (readme, ‘rozdział’ “Coming up with your own role implementation”), ale z tego, co pamiętam, to później powodowało to u mnie błędy przy bodajże asocjacjach, więc jeżeli potrzebujesz prostego gemu, to do tego zadania jak najbardziej polecam CanCana.

To również musisz sam zaimplementować. Przykład ze screencastu:

can :update, Comment do |comment| comment.try(:user) == user end

I później w widoku:

<% if can? :update, comment %> <%= link_to "Edit", edit_comment_path(comment) %> | <% end %>

dzięki rav, narazie zaimplementowałem Acl9 ale rady napewno się przydadzą gdy będe chciał w czymś innym użyć CanCan
krzyzak: dostałem odpowiedż na to issue, żeby używać user.role_objects