it-swarm.com.de

Wie entferne ich die Devise-Route, um mich anzumelden?

Ich verwende Devise in einer Rails 3-App. In diesem Fall muss jedoch ein Benutzer von einem vorhandenen Benutzer erstellt werden, der bestimmt, welche Berechtigungen er/sie haben wird.

Aus diesem Grund möchte ich:

  • An Entfernen Sie die Route, die Benutzer zur Anmeldung benötigen
  • An Benutzer dürfen weiterhin ihre Profile bearbeiten (E-Mail-Adresse und Kennwort ändern) danach sie haben sich angemeldet

Wie kann ich das machen?

Momentan entferne ich diese Route effektiv, indem Sie vor devise_for :users Folgendes einfügen:

match 'users/sign_up' => redirect('/404.html')

Das funktioniert, aber ich kann mir vorstellen, dass es einen besseren Weg gibt, richtig?

Aktualisieren

Wie Benoit Garret sagte, ist die beste Lösung in meinem Fall das Überspringen der Erstellung der Registrierungsrouten und die Erstellung der Routen, die ich eigentlich will. 

Um das zu tun, habe ich zuerst rake routes ausgeführt und dann die Ausgabe verwendet, um diejenigen neu zu erstellen, die ich wollte. 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 meinem User-Modell
  • devise/registrations übernimmt die Aktualisierung von E-Mail und Passwort
  • Das Aktualisieren anderer Benutzerattribute - Berechtigungen usw. - wird von einem anderen Controller verwaltet

Aktuelle Antwort:

Entfernen Sie die Route für die standardmäßigen Devise-Pfade. d.h.

devise_for :users, path_names: {
  sign_up: ''
}
144
Nathan Long

Ich habe auch versucht, dies zu tun, aber ein Thread in der Devise-Google-Gruppe hat mich davon abgehalten, nach einer wirklich sauberen Lösung zu suchen.

Ich zitiere José Valim (den Devise-Betreuer):

Es gibt keine direkte Option. Sie können entweder einen Patch zur Verfügung stellen oder verwenden Sie: überspringen =>: registrierbar und fügen Sie nur die gewünschten Routen hinzu.

Die ursprüngliche Frage war:

Gibt es eine gute Möglichkeit, eine bestimmte Route zu entfernen (die Route löschen) von Rails?

52
Benoit Garret

sie können dies in Ihrem Modell tun

# typical devise setup in User.rb
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

Ändern Sie es in:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

beachten Sie, dass das Symbol :registerable entfernt wurde

Das ist es, nichts anderes ist erforderlich. Alle Routen und Links zur Registrierungsseite werden ebenfalls auf magische Weise entfernt.

88
stephenmurdoch

Ich hatte ein ähnliches Problem versucht, devise_invitable pfade für create und neu zu entfernen:

vor:

 devise_for :users

Rechenwege

accept_user_invitation GET    /users/invitation/accept(.:format)           devise/invitations#edit
       user_invitation POST   /users/invitation(.:format)                  devise/invitations#create
   new_user_invitation GET    /users/invitation/new(.:format)              devise/invitations#new
                       PUT    /users/invitation(.:format)                  devise/invitations#update

nach dem

devise_for :users , :skip => 'invitation'
devise_scope :user do
  get "/users/invitation/accept", :to => "devise/invitations#edit",   :as => 'accept_user_invitation'
  put "/users/invitation",        :to => "devise/invitations#update", :as => nil
end

Rechenwege

accept_user_invitation GET    /users/invitation/accept(.:format)                 devise/invitations#edit
                       PUT    /users/invitation(.:format)                        devise/invitations#update

note 1 Anwendungsbereich https://github.com/plataformatec/devise#configuring-routes

note 2 Ich wende es auf devise_invitable an, aber es funktioniert mit jedem * fähigen Feature

Wichtiger Hinweis: sehen, dass devise_scope auf Benutzer nicht Benutzer ist. das ist richtig, pass auf das auf! Es kann viele Schmerzen verursachen, die Ihnen dieses Problem verursachen:

Started GET "/users/invitation/accept?invitation_token=xxxxxxx" for 127.0.0.1 
Processing by Devise::InvitationsController#edit as HTML
  Parameters: {"invitation_token"=>"6Fy5CgFHtjWfjsCyr3hG"}
 [Devise] Could not find devise mapping for path "/users/invitation/accept?  invitation_token=6Fy5CgFHtjWfjsCyr3hG".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
     match "/some/route" => "some_devise_controller"
  end

 2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

    @request.env["devise.mapping"] = Devise.mappings[:user]
30
equivalent8

Ich habe einen weiteren Beitrag ähnlich diesem gefunden und wollte eine Antwort mit @chrisnicola teilen. In der Post versuchten sie, die Benutzeranmeldung 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"

class RegistrationsController < Devise::RegistrationsController
  def new
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end

  def create
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end
end

Dadurch wird der Controller von devise überschrieben und stattdessen die oben genannten Methoden verwendet. Sie fügten Flash-Nachrichten hinzu, falls jemand es irgendwie auf die Seite sign_up geschafft hatte. Sie sollten auch die Weiterleitung auf einen beliebigen Pfad ändern können.

In "config/routes.rb" können Sie Folgendes hinzufügen: 

devise_for :users, :controllers => { :registrations => "registrations" }

Wenn Sie es so belassen, können Sie das Standard-Profil verwenden, um Ihr Profil zu bearbeiten. Wenn Sie möchten, können Sie die Option zum Bearbeiten des Profils noch durch Aufnehmen von überschreiben 

  def update
  end

in der "app/controller/registrations_controller.rb"

20
Daniel

Sie können das "devise_scope" überschreiben, indem Sie es vor dem "devise_for" platzieren.

devise_scope :user do
  get "/users/sign_up",  :to => "sites#index"
end

devise_for :users

Ich bin nicht sicher, ob dies der beste Weg ist, aber es ist derzeit meine Lösung, da es nur auf die Anmeldeseite umleitet.

12
Midnight

Dies ist eine alte Frage - aber vor kurzem hatte ich dasselbe Problem gelöst und eine Lösung gefunden, die weitaus eleganter ist als:

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

Und es gibt die Standardnamen für die benannten Routen (wie cancel_user_registration), ohne übermäßig ausführlich zu sein.

devise_for :users, skip: [:registrations]

# Recreates the Devise registrations routes
# They act on a singular user (the signed in user)
# Add the actions you want in 'only:'
resource :users,
    only: [:edit, :update, :destroy],
    controller: 'devise/registrations',
    as: :user_registration do
  get 'cancel'
end

rake routes Ausgabe mit den Standardgerätemodulen:

                  Prefix Verb   URI Pattern                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
       user_registration PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
11
max

Tun Sie dies in routes.rb

devise_for :users, :controllers => {:registrations => "registrations"}, :skip => [:registrations]
  as :user do
    get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
    put 'users' => 'devise/registrations#update', :as => 'user_registration'
end

  devise_scope :user do
    get "/sign_in",  :to => "devise/sessions#new"
    get "/sign_up",  :to => "devise/registrations#new"
  end

sie erhalten jetzt eine Fehlermeldung, wenn Sie sich auf der Anmeldeseite anmelden, um diese zu beheben. Ändern Sie diese Einstellung in: app/views/devise/shared/_links.erb

<% if  request.path != "/sign_in" %>
    <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
        <%= link_to "Sign up", new_registration_path(resource_name) %><br />
    <% end -%>
<% end %>
4
Syed

Ich mochte @ max's answer , aber beim Versuch, es zu benutzen, bin ich auf einen Fehler gestoßen, weil devise_mapping null ist.

Ich habe seine Lösung etwas geändert, um das Problem zu lösen. Es war erforderlich, den Aufruf in resource in devise_scope umzuwandeln.

devise_for :users, skip: [:registrations]

devise_scope :user do
  resource :users,
           only: [:edit, :update, :destroy],
           controller: 'devise/registrations',
           as: :user_registration do
    get 'cancel'
  end
end

Beachten Sie, dass devise_scope den Singular :user erwartet, wohingegen resource den Plural :users erwartet.

4
dvanoni

Für andere in meinem Fall.
Mit devise (3.5.2).
Ich habe die Routen zur Anmeldung erfolgreich entfernt, aber die Routen zum Bearbeiten des Profils mit folgendem Code beibehalten.

#routes.rb
devise_for :users, skip: [:registrations]
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put '/users(.:format)' => 'devise/registrations#update', as: 'user_registration'
  patch '/users(.:format)' => 'devise/registrations#update'
end
2
Micka

Ich habe festgestellt, dass dies gut funktioniert, ohne sich mit Routen zu beschäftigen oder Methoden für den Anwendungscontroller hinzuzufügen. Mein Ansatz ist es, die Entwicklungsmethode zu überschreiben. Fügen Sie dies zu app/controllers/devise/registrations_controller.rb.__ hinzu. Ich habe die anderen Methoden der Kürze halber weggelassen. 

class Devise::RegistrationsController < DeviseController
  ...
  # GET /resource/sign_up
  def new
    redirect_to root_path
  end
  ....
end

Um auch die Illusion zu beseitigen, dass dieser Pfad aus anderen Ansichten noch erreichbar ist, möchten Sie möglicherweise auch diesen Code aus app/views/devise/shared/_links.erb entfernen.

<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end -%>
2
lacostenycoder

Hier ist die etwas andere Route, die ich gegangen bin. Dadurch müssen Sie die Ansicht devise/shared/_links.html.erb Nicht überschreiben.

In app/models/user.rb:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

In config/routes.rb:

devise_for :users
devise_scope :user do
  put 'users' => 'devise/registrations#update', as: 'user_registration'
  get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
  delete 'users' => 'devise/registrations#destroy', as: 'registration'
end

Vor:

$ rake routes | grep devise
           new_user_session GET    /users/sign_in(.:format)                    devise/sessions#new
               user_session POST   /users/sign_in(.:format)                    devise/sessions#create
       destroy_user_session DELETE /users/sign_out(.:format)                   devise/sessions#destroy
              user_password POST   /users/password(.:format)                   devise/passwords#create
          new_user_password GET    /users/password/new(.:format)               devise/passwords#new
         edit_user_password GET    /users/password/edit(.:format)              devise/passwords#edit
                            PATCH  /users/password(.:format)                   devise/passwords#update
                            PUT    /users/password(.:format)                   devise/passwords#update
   cancel_user_registration GET    /users/cancel(.:format)                     devise/registrations#cancel
          user_registration POST   /users(.:format)                            devise/registrations#create
      new_user_registration GET    /users/sign_up(.:format)                    devise/registrations#new
     edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
                            PATCH  /users(.:format)                            devise/registrations#update
                            PUT    /users(.:format)                            devise/registrations#update
                            DELETE /users(.:format)                            devise/registrations#destroy

Nach:

$ rake routes | grep devise
           new_user_session GET    /users/sign_in(.:format)                    devise/sessions#new
               user_session POST   /users/sign_in(.:format)                    devise/sessions#create
       destroy_user_session DELETE /users/sign_out(.:format)                   devise/sessions#destroy
              user_password POST   /users/password(.:format)                   devise/passwords#create
          new_user_password GET    /users/password/new(.:format)               devise/passwords#new
         edit_user_password GET    /users/password/edit(.:format)              devise/passwords#edit
                            PATCH  /users/password(.:format)                   devise/passwords#update
                            PUT    /users/password(.:format)                   devise/passwords#update
          user_registration PUT    /users(.:format)                            devise/registrations#update
     edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
               registration DELETE /users(.:format)                            devise/registrations#destroy
1
bmaddy

Durch das Ändern der Routen ergeben sich eine Reihe anderer Probleme. Die einfachste Methode, die ich gefunden habe, ist folgendes zu tun.

ApplicationController < ActionController::Base
  before_action :dont_allow_user_self_registration

  private

  def dont_allow_user_self_registration
    if ['devise/registrations','devise_invitable/registrations'].include?(params[:controller]) && ['new','create'].include?(params[:action])
      redirect_to root_path
    end
  end
end
0
Weston Ganger

Ich hatte das gleiche Problem und fand es etwas schlecht, Benutzer von der Registrierungsseite umzuleiten. Meine Lösung ist also grundsätzlich :registrable überhaupt nicht.

Was ich getan habe, war eine ähnliche Seite zu erstellen, wie Benutzerdaten bearbeiten, die wie folgt aussahen:

<%= form_tag(update_user_update_path, method: :post) do %>  
    <br>
    <%= label_tag(:currPassword, 'Current password:') %> <%= password_field_tag(:currPassword) %> <br>
    <%= label_tag(:newPassword, 'New password:') %> <%= password_field_tag(:newPassword) %> <br>
    <%= label_tag(:newPasswordConfirm, 'Confirm new password:') %> <%= password_field_tag(:newPasswordConfirm) %> <br>
    <%= submit_tag('Update') %>
<% end %>

Dieses Formular wird also an einen neuen Post-Endpunkt übermittelt, der das Kennwort aktualisiert. Dies sieht folgendermaßen aus:

  def update
    currPass = params['currPassword']
    newPass1 = params['newPassword']
    newPass2 = params['newPasswordConfirm']
    currentUserParams = Hash.new()
    currentUserParams[:current_password] = currPass
    currentUserParams[:password] = newPass1
    currentUserParams[:password_confirmation] = newPass2
    @result = current_user.update_with_password(currentUserParams)
  end

Später können Sie den @result in Ihrer Ansicht verwenden, um dem Benutzer mitzuteilen, ob das Kennwort aktualisiert wurde oder nicht.

0
Sarp Kaya