Ich verwende Devise in einer Rails 3-App. In diesem Fall muss ein Benutzer von einem vorhandenen Benutzer erstellt werden, der bestimmt, über welche Berechtigungen er verfügt.
Aus diesem Grund möchte ich:
- So entfernen Sie die Route, auf der sich Benutzer anmelden können .
- Um immer noch zu erlauben , Benutzer zu bearbeiten ihre Profile (ändern E - Mail - Adresse und Passwort) , nachdem sie haben unterschrieben
Wie kann ich das machen?
Derzeit entferne ich diese Route effektiv, indem ich Folgendes vorstelle devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
Das funktioniert, aber ich stelle mir vor, es gibt einen besseren Weg, oder?
Aktualisieren
Wie Benoit Garret sagte, besteht die beste Lösung in meinem Fall darin, das Erstellen der Registrierungsrouten in Massen zu überspringen und nur die zu erstellen, die ich tatsächlich möchte.
Dazu habe ich zuerst ausgeführt rake routes
und dann die Ausgabe verwendet, um die gewünschten neu zu erstellen. Das Endergebnis war folgendes:
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
Beachten Sie, dass:
- Ich habe noch
:registerable
in meinemUser
Modell devise/registrations
kümmert sich um die Aktualisierung von E-Mail und Passwort- Das Aktualisieren anderer Benutzerattribute - Berechtigungen usw. - wird von einem anderen Controller durchgeführt
Aktuelle Antwort:
Entfernen Sie die Route für die Standardpfade. dh:
devise_for :users, path_names: {
sign_up: ''
}
quelle
https://example.com/users/
. Siehe meine Antwort unten.Antworten:
Ich habe auch versucht, dies zu tun, aber ein Thread über die Google-Gruppe mich davon abgehalten, nach einer wirklich sauberen Lösung zu suchen.
Ich zitiere José Valim (den Devise-Betreuer):
Die ursprüngliche Frage war:
quelle
:skip => :registrations
nicht der Fall:skip => :registerable
.Sie können dies in Ihrem Modell tun
ändere es in:
Beachten Sie, dass das Symbol
:registerable
entfernt wurdeDas war's, sonst ist nichts erforderlich. Alle Routen und Links zur Registrierungsseite werden ebenfalls auf magische Weise entfernt.
quelle
edit_user_registration
, den ich brauche. Wie gesagt: "Sie sollten weiterhin in der Lage sein, ihre Profile zu bearbeiten."localhost:3000/admin
wo sie ihr Konto bearbeiten können, selbst wenn das widerstandsfähige Objekt entfernt wurde. Wenn dies keine praktikable Lösung ist, werfen Sie einen Blick auf CanCan, mit dem Sie festlegen können, wer auf eine Ressource zugreifen kann und wer nicht. Ich neige dazu, Rollen wie "admin" oder "moderator" hinzuzufügen und alle anderen von den Anmeldeseiten auszuschließen.sign_in
in der Produktion deaktivieren ?Ich hatte ein ähnliches Problem versucht, devise_invitable Pfade für create und new zu entfernen :
Vor:
Rechenrouten
nach dem
Rechenrouten
Anmerkung 1: Gültigkeitsbereich https://github.com/plataformatec/devise#configuring-routes
note 2 Ich wende es auf devise_invitable an, aber es funktioniert mit jeder devise * -fähigen Funktion
Wichtiger Hinweis: Sehen Sie, dass devise_scope für Benutzer und nicht für Benutzer bestimmt ist ? das ist richtig, pass auf! Es kann viele Schmerzen verursachen, die Ihnen dieses Problem verursachen:
quelle
Ich fand einen ähnlichen Beitrag und wollte eine Antwort teilen, die @chrisnicola gab. In der Post wurde versucht, Benutzeranmeldungen nur während der Produktion zu blockieren.
Sie können auch den Registrierungscontroller ändern. Sie können so etwas verwenden:
In "app / controller / registrations_controller.rb"
Dadurch wird der Controller des Geräts überschrieben und stattdessen die oben genannten Methoden verwendet. Sie haben Flash-Nachrichten hinzugefügt, falls jemand es irgendwie auf die Seite sign_up geschafft hat. Sie sollten auch in der Lage sein, die Umleitung in einen beliebigen Pfad zu ändern.
Auch in "config / route.rb" können Sie Folgendes hinzufügen:
Wenn Sie dies so belassen, können Sie das Standardgerät verwenden, um Ihr Profil zu bearbeiten. Wenn Sie möchten, können Sie die Option zum Bearbeiten des Profils weiterhin durch Einfügen überschreiben
in der "app / controller / registrations_controller.rb"
quelle
Dies ist eine alte Frage - aber ich hatte kürzlich das gleiche Problem gelöst und eine Lösung gefunden, die weitaus eleganter ist als:
Und es gibt die Standardnamen für die benannten Routen (wie
cancel_user_registration
) an, ohne übermäßig ausführlich zu sein.rake routes
Ausgabe mit den Standardmodulen:quelle
Sie können das "devise_scope" überschreiben, indem Sie es vor das "devise_for" stellen.
Ich bin mir nicht sicher, ob dies der beste Weg ist, aber es ist derzeit meine Lösung, da es nur zur Anmeldeseite zurückleitet.
quelle
/users/sign_up
Sie Zugriff auf diesites#index
nicht,sign_up
aber die Adresse bleibt weiterhin erhalten/users/sign_up
.Ich mochte die Antwort von @ max , aber als ich versuchte, sie zu verwenden, stieß ich auf einen Fehler aufgrund von
devise_mapping
ich null war.Ich habe seine Lösung leicht dahingehend geändert, dass sie das Problem zu lösen scheint. Der Anruf musste nach
resource
innen verpackt werdendevise_scope
.Beachten Sie,
devise_scope
dass der Singular erwartet wird,:user
währendresource
der Plural erwartet wird:users
.quelle
Tun Sie dies in route.rb
Sie erhalten jetzt eine Fehlermeldung, während Sie zur Anmeldeseite kommen, um sie zu beheben. Nehmen Sie diese Änderung vor in: app / views / devise / shared / _links.erb
quelle
devise_for
und denas
Block verwendet) und ich musste ihn:registerable
im Modell entfernen .Ich habe festgestellt, dass dies gut funktioniert, ohne mit Routen herumzuspielen oder Anwendungscontrollermethoden hinzuzufügen. Mein Ansatz ist es, die Entwurfsmethode zu überschreiben. Fügen Sie dies hinzu,
app/controllers/devise/registrations_controller.rb
ich habe die anderen Methoden der Kürze halber weggelassen.Um die Illusion zu beseitigen, dass dieser Pfad aus anderen Ansichten noch erreichbar ist, möchten Sie möglicherweise auch diesen Code entfernen
app/views/devise/shared/_links.erb
quelle
Für andere in meinem Fall.
Mit
devise (3.5.2)
.Ich habe die Routen zur Anmeldung erfolgreich entfernt, aber diejenigen zum Bearbeiten des Profils mit dem folgenden Code beibehalten.
quelle
Hier ist der etwas andere Weg, den ich gegangen bin. Es macht es so, dass Sie das nicht überschreiben müssen
devise/shared/_links.html.erb
Ansicht .In
app/models/user.rb
:In
config/routes.rb
:Vor:
Nach dem:
quelle
devise_for :users, skip: :all
Ich hatte das gleiche Problem und fand es etwas schlecht, Benutzer von der Registrierungsseite umzuleiten. Meine Lösung ist also im Grunde nicht zu verwenden
:registrable
.Was ich getan habe, war, eine ähnliche Seite wie das Bearbeiten von Benutzerdetails zu erstellen, die wie folgt aussah:
Dieses Formular wird also an einen neuen Post-Endpunkt gesendet, der das Kennwort aktualisiert. Dies sieht folgendermaßen aus:
Später können Sie das
@result
in Ihrer Ansicht verwenden, um dem Benutzer mitzuteilen, ob das Kennwort aktualisiert wurde oder nicht.quelle
Durch das Ändern der Routen ergeben sich eine ganze Reihe weiterer Probleme. Die einfachste Methode, die ich gefunden habe, ist die folgende.
quelle
Sie können den
devise
Edelstein selbst ändern . Führen Sie zunächst diesen Befehl aus, um den installierten Speicherort für Folgendes zu ermitteln:gem which devise
Nehmen wir an, der Pfad ist:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Dann geh zu
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
undroutes.rb
in diesem Verzeichnis bearbeiten . Es gibt eine Methode,def devise_registration(mapping, controllers)
die Sie ändern können, um die neue Aktion zu entfernen. Sie können die Zuordnungen für auch vollständig entfernendevise_registration
quelle
gem 'devise', github: 'yourusername/devise', branch: "master"
)