Ukrywanie zawartości podstron

Witam,

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?

Z góry dziękuję za pomoc.
Piotr

Witam :slight_smile:

Najlepiej będzie użyć w kontrolerze before_filter sprawdzający, czy user ma dostęp do akcji. Polecam: http://guides.rubyonrails.org/action_controller_overview.html#filters

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

Tak, o to chodzi.

Super! Dziekuję.

Przyjrzyj się gemowi cancan.

No właśnie jak apohllo mówi, nie odkrywaj koła na nowo.

Szczerze mówiąc nie ogarniam jeszcze czystego RoRa, a musze dłubać w dziwnej aplikacji z hobo… narazie zrobię jak nagl proponował

Witam ponownie!

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

 <deactivate-user-form hidden="acting_user.administrator?" />

Wypluwa compile error.

Macie jakies pomysły?

<%= costam %>

To nie to samo co:

<% costam %>

If you want some Ruby code executed, enclose it between <% and %>

If you want the result of the code execution to be printed out, as part of the output, enclose the code between <%= and %>.

Faktycznie… mała wtopa
Przerobiłem kod na:

<% 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)

Dopisanie metody self.administrator nie pomaga, bo powinienes dopisac:

def self.administrators? ... end
Czy powinna byc wbudowana to nie wiem, bo nie wiem czego uzywasz

Racja, dziękuję za zwrócenie uwagi.

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??

Spróbuj if logged_in? and acting_user.administrator?
Metody w modelach nie mają dostępu do zmiennych/metod w kontrolerach (takich jak acting_user).

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.