Mam kolejne szalone pytanie, mozliwe, że znów trywialne, bo nie znajduję odpowiedzi w sieci.
Model użytkownika zawiera pole ‘role’
role enum_string(:international, :sales, :resourcing, :playmaker, :commercial)
oraz
named_scope :administrators, :conditions => { :administrator => true }
named_scope :decider, :conditions => { :role => "playmaker" }
named_scope :resourcer, :conditions => { :role => "resourcing" }
named_scope :selling, :conditions => "role = 'sales' or role = 'playmaker'"
Chciałbym, żeby w zależności od tej roli użytkownik miał, bądź nie możliwość oglądania konkretnych podstron aplikacji.
Nie wiem jednak jak to zrobić?
Czy jakiś view_permittion? user.decider? end Jesli tak, to czy w modelu user’a?
Czy może jakiś warunek w zupełnie innym miejscu?
Jesli dobrze rozumiem ten tutorial, before_filter wrzucam do każdego kontrolera inny, w zalezności od tego jaki mi będzie potrzebny. (jesli wrzuce wszystkie do application_controler to rozpropagują mi się wszystkie wszędzie, a tego nie chcę) A sama metoda powinna wyglądać mniejwięcej tak:
def check_role
unless (current_user.role == "jakaś_rola")
flash[:error] = "You are not allowed to access this section"
redirect_to :index
end
end
Chciałbym spytać o sposób na ukrycie konkretnego elementu na stronie (konkretnie formularza)
Wyswietlam sobie formularz przy pomocy taga jako fragment strony edit.dryml.
Nie bardzo mogę ukryć ten moduł z poziomu controllera (tzn. nie wiem jak), a obudowanie taga tak:
<%= if acting_user.administrator? %>
<%= <deactivate-user-form /> %>
<%= end %>
lub zmodyfikowanie
<% if logged_in? && User.administrators? %>
<deactivate-user-form />
<% end %>
Dostaję jednak bład “undefined method `administrators?’”
Dopisanie metody w modelu użytkownika:
def self.administrator
return acting_user.administrator?
end
nie pomaga (z resztą taka funkcja powinna być chyba wbudowana)
To zaprowadziło mnie do “undefined local variable or method acting_user'" Czyli jeśli dobrze rozumiem, moja metoda jest publiczna (skoro wchodzę do środka), ale acting_user jest puste... Jeśli zmieniam acting_user na @acting_user dostaję "undefined methodadministrator?’ for nil:NilClass”, czyli jeśli dobrze rozumiem, nie jestem w stanie wyciągnąć informacji o użytkowniku. Rozbijam się o zagadnienie public-private??
Cała praca, z wołaniem użytkownika i sprawdzaniem uprawnień okazała się niepotrzebna.
W międzyczasie dokopałem się do: http://cookbook.hobocentral.net/questions/60-why-can-t-i-call-acting
Co również potwierdził hekto5 (swoją drogą, jak w takim razie można się tam odwołać?)
Rozwiązałem swój problem przez rozszerzenie taga do postaci:
<daectivate_user_form if="&can_edit?" />
Nie wiem czy jest to optymalne rozwiązanie, ale w ten sposób ukrywany jest formularz edycji użytkownika, więc powinno działać prawidłowo.