Niedawno zainstalowałem program Devise na aplikacji szyny i zastanawiam się, czy można uzyskać wystąpienie aktualnie zalogowanego użytkownika w jednym z innych modeli lub kontrolerów, a jeśli tak, to jak to zrobić? ?Rails Devise: zdobądź obiekt aktualnie zalogowanego użytkownika?
Odpowiedz
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?
”
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.
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
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
.
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"
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
Ale gdzie w obiekcie żądania znajdują się te informacje? – mehulkar