Używam Devise w aplikacji Rails 3, ale w tym przypadku użytkownik musi być utworzony przez istniejącego użytkownika, który określa, jakie uprawnienia będzie miał.
Z tego powodu chcę:
- Aby usunąć trasę dla użytkowników do rejestracji .
- Aby nadal zezwalać użytkownikom na edytowanie swoich profili (zmiana adresu e-mail i hasła) po zarejestrowaniu się
W jaki sposób mogę to zrobić?
Obecnie skutecznie usuwam tę trasę, umieszczając przed devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
To działa, ale wyobrażam sobie, że jest lepszy sposób, prawda?
Aktualizacja
Jak powiedział Benoit Garret, najlepszym rozwiązaniem w moim przypadku jest pominięcie masowego tworzenia tras rejestracji i utworzenie tych, które faktycznie chcę.
Aby to zrobić, najpierw uruchomiłem rake routes
, a następnie wykorzystałem dane wyjściowe do odtworzenia tych, które chciałem. Wynik końcowy był następujący:
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
Zauważ, że:
- Nadal mam
:registerable
w swoimUser
modelu devise/registrations
obsługuje aktualizację adresu e-mail i hasła- Aktualizowanie innych atrybutów użytkownika - uprawnień itp. - jest obsługiwane przez inny kontroler
Rzeczywista odpowiedź:
Usuń trasę dla domyślnych ścieżek Devise; to znaczy:
devise_for :users, path_names: {
sign_up: ''
}
ruby-on-rails-3
routing
devise
Nathan Long
źródło
źródło
https://example.com/users/
. Zobacz moją odpowiedź poniżej.Odpowiedzi:
Ja też próbowałem to zrobić, ale wątek w opracowanej przeze mnie grupie Google odstraszył mnie od szukania naprawdę czystego rozwiązania.
Zacytuję José Valima (opiekuna Devise):
Pierwotne pytanie brzmiało:
źródło
:skip => :registrations
nie jest:skip => :registerable
.możesz to zrobić w swoim modelu
zmień to na:
zauważ, że symbol
:registerable
został usuniętyTo wszystko, nic więcej nie jest wymagane. Wszystkie trasy i linki do strony rejestracji są również magicznie usuwane.
źródło
edit_user_registration
której potrzebuję. Jak powiedziałem, „nadal powinni mieć możliwość edytowania swoich profili”.localhost:3000/admin
miejsca, w którym mogą edytować swoje konto, nawet po usunięciu obiektu odpornego na działanie. Jeśli nie jest to wykonalne rozwiązanie, spójrz na CanCan, który pozwala określić, kto może, a kto nie może uzyskać dostępu do zasobu. Mam tendencję do dodawania ról, takich jak „administrator” lub „moderator”, i blokowania wszystkim pozostałym osobom dostępu do stron rejestracji.sign_in
w produkcji?Miałem podobny problem, próbując usunąć ścieżki devise_invitable dla tworzenia i nowego :
przed:
trasy rake
po
trasy rake
uwaga 1 zakres opracowania https://github.com/plataformatec/devise#configuring-routes
uwaga 2 Stosuję go na devise_invitable, ale będzie działać z każdą funkcją devise * w stanie
Ważna uwaga: czy widzisz, że devise_scope dotyczy użytkowników, a nie użytkowników ? zgadza się, uważaj na to! Może powodować wiele bólu, powodując ten problem:
źródło
Znalazłem inny post podobny do tego i chciałem podzielić się odpowiedzią, której udzielił @chrisnicola. W poście próbowali zablokować rejestrację użytkowników tylko podczas produkcji.
Możesz także zmodyfikować kontroler rejestracji. Możesz użyć czegoś takiego:
W „app / controllers / registrations_controller.rb”
Spowoduje to zastąpienie kontrolera devise i zamiast tego użyje powyższych metod. Dodali wiadomości flash na wypadek, gdyby ktoś w jakiś sposób znalazł się na stronie sign_up. Powinieneś także móc zmienić przekierowanie na dowolną ścieżkę.
Również w „config / tours.rb” możesz dodać to:
Pozostawienie tego w ten sposób pozwoli Ci korzystać ze standardowego urządzenia do edycji swojego profilu. Jeśli chcesz, nadal możesz zastąpić opcję edycji profilu, włączając
w „app / controllers / registrations_controller.rb”
źródło
To stare pytanie - ale ostatnio rozwiązałem ten sam problem i znalazłem rozwiązanie, które jest znacznie bardziej eleganckie niż:
I podaje domyślne nazwy nazwanych tras (np.
cancel_user_registration
), Nie będąc nadmiernie rozwlekłymi.rake routes
wyjście z domyślnymi modułami devise:źródło
Możesz nadpisać „devise_scope”, umieszczając ją przed „devise_for”.
Nie jestem pewien, czy to najlepszy sposób, ale obecnie jest to moje rozwiązanie, ponieważ po prostu przekierowuje z powrotem do strony logowania.
źródło
/users/sign_up
, będziesz mieć dostęp dosites#index
nie,sign_up
ale adres nadal pozostanie/users/sign_up
.Lubiłem @ Maxa odpowiedzią , ale kiedy próbuje go używać wpadłem błędu z powodu
devise_mapping
będącego zera.Zmodyfikowałem nieco jego rozwiązanie, aby rozwiązać ten problem. Wymagało to skierowania rozmowy do
resource
środkadevise_scope
.Zauważ, że
devise_scope
oczekuje liczby pojedynczej,:user
podczas gdyresource
oczekuje liczby mnogiej:users
.źródło
Zrób to w route.rb
pojawi się błąd podczas logowania się na stronie, aby go naprawić. Zrób tę zmianę w: app / views / devise / shared / _links.erb
źródło
devise_for
ias
bloku) i musiałem usunąć:registerable
w modelu.Zauważyłem, że to działa dobrze bez majstrowania przy trasach lub dodawania metod kontrolera aplikacji. Moje podejście polega na zastąpieniu metody opracowanej. Dodaj to do
app/controllers/devise/registrations_controller.rb
Pominąłem inne metody dla zwięzłości.Aby usunąć złudzenie, że ta ścieżka jest nadal dostępna z innych widoków, możesz również chcieć usunąć ten kod
app/views/devise/shared/_links.erb
źródło
Dla innych w moim przypadku.
Z
devise (3.5.2)
.Pomyślnie usunąłem trasy do rejestracji, ale zachowałem te do edycji profilu, z następującym kodem.
źródło
Oto nieco inna trasa, którą poszedłem. Dzięki temu nie musisz przesłonić
devise/shared/_links.html.erb
widoku.W
app/models/user.rb
:W
config/routes.rb
:Przed:
Po:
źródło
devise_for :users, skip: :all
Miałem ten sam problem i przekierowywanie użytkowników ze strony rejestracji było trochę złą praktyką. Więc moje rozwiązanie w zasadzie
:registrable
w ogóle nie używa .To, co zrobiłem, to utworzenie podobnej strony, takiej jak edycja danych użytkownika, która wyglądała następująco:
Więc ten formularz jest przesyłany do nowego punktu końcowego postu, który aktualizuje hasło, które wygląda następująco:
Później możesz użyć
@result
w swoim widoku, aby poinformować użytkownika, czy hasło zostało zaktualizowane, czy nie.źródło
Zmiana tras wiąże się z całą masą innych problemów. Najłatwiejszą metodą, jaką znalazłem, jest wykonanie następujących czynności.
źródło
Możesz zmodyfikować
devise
sam klejnot. Najpierw uruchom to polecenie, aby znaleźć zainstalowaną lokalizację za pomocą:gem which devise
Załóżmy, że ścieżka to:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Następnie idź do
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
i edytujroutes.rb
w tym katalogu. Istnieje metoda o nazwie,def devise_registration(mapping, controllers)
którą możesz zmodyfikować, aby pozbyć się nowej akcji. Możesz także całkowicie usunąć mapowania dladevise_registration
źródło
gem 'devise', github: 'yourusername/devise', branch: "master"
)