2010-11-10 12 views

Odpowiedz

112

Dewel tworzy metody wygody w locie, które reprezentują aktualnie zalogowanego użytkownika.

Jednak należy pamiętać, że wygenerowana nazwa metody zawiera nazwę klasy Twojego modelu użytkownika. na przykład jeśli twój model Devise nazywa się "User", wówczas aktualnie zalogowany użytkownik może uzyskać dostęp za pomocą "current_user", a jeśli twoja klasa Devise jest "Admin", wówczas zalogowany użytkownik administracyjny może być dostępny z "current_admin".

Istnieje wiele innych metod utworzonych z podobnymi konwencjami, na przykład "user_signed_in?" lub ponownie "admin_signed_in?", które są naprawdę ładne. dostępne są w kontrolery i widoki

Te metody więc może mieć następujące w widoku:

<% if user_signed_in? %> 
    <div>Signed in as... <%= current_user.email %></div> 
<% end %> 

Wreszcie, jeśli używasz dwóch lub więcej Opracować modele w swojej aplikacji (np użytkownika i administratora), można użyć metody „anybody_signed_in?” wygoda, by sprawdzić, czy którykolwiek z tych typów użytkowników zostały podpisane w:

<% if anybody_signed_in? %> 
    <h2>Special offers</h2> 
    <p>All registered users will receive free monkeys!</p> 
<% end %> 

Aktualizacja:

Od opracować wersji 1.2.0, „anybody_signed_in?” została wycofana i zastąpiona przez „signed_in?

+1

Wszystko, co Scott mówi, jest poprawne, ale także (i to może być również nowe) Wywołaj wywołania "user" i "admin" tutaj " zakresy ". Jeśli widzisz to słowo w dokumentacji, właśnie o to chodzi. – Peeja

+0

Ale gdzie w obiekcie żądania znajdują się te informacje? – mehulkar

1

Przekaż go jako parametr do wywołania metody :).

Jednym z pomysłów jest wykorzystanie Thread.current[:current_user] = @current_user jako before_filter - ale jeśli używasz stos rozmieszczenia jak Chude + EM_Mysql2 + Rack :: FiberPool, musisz ustawić, że do Fiber.current[:current_user].

Rozwiązania te po prostu zasłaniają brak dobrej logiki projektowej.

+0

Osobiście pod wystaje wartości kontekstowe na przedmiot gwintu być "zapach". Zdajesz sobie sprawę, że w ostatnim wierszu, tak po prostu, ale chcę tylko podkreślić, że ... – jaydel

15

są dostępne tylko w sterowniku i przeglądaj warstwy Metody pomocnicze opracować. Nie są dostępne w warstwie modelu (patrz sekcja Filtry kontrolerów i pomocników pod numerem README).

  • Is it possible to get the currently logged in user from within a model?.

Nie jest to możliwe za pomocą domyślnych metod pomocniczych, które Devise tworzy dla ciebie. Istnieje jednak wiele alternatywnych metod, które można zastosować, aby dostarczyć model do modelu current_user. Najprostszy sposób został już zaproponowany przez Alexa Bartlowa, a to po prostu przekazać current_user za pomocą metody do swojego modelu.

  • Is it possible to get the currently logged in user from within a controllers?

Tak jest to możliwe. Użyj current_<modelname>, gdzie <modelname> to nazwa modelu, który ma możliwości uwierzytelniania Devise (tj. Przez rails g devise <modelname>).Jeśli na przykład Twój model to User, użyjesz current_user. Jeśli Twój model to Elmo, możesz użyć current_elmo.

1

prosty sposób jest następujący:

if @suit.user == current_user 

przykład:

= link_to "Back", root_path, class: "btn btn-default" 

    -if @suit.user == current_user 

    = link_to "Edit", edit_suit_path, class: "btn btn-default" 

    = link_to "Delete", suit_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default" 
Powiązane problemy