J'utilise Devise dans une application Rails 3, mais dans ce cas, un utilisateur doit être créé par un utilisateur existant, qui détermine les autorisations dont il disposera.
Pour cette raison, je veux:
- Pour supprimer l'itinéraire pour que les utilisateurs s'inscrivent .
- Pour continuer à permettre aux utilisateurs de modifier leurs profils ( modifier leur adresse e-mail et leur mot de passe) après leur inscription
Comment puis-je faire ceci?
Actuellement, je supprime effectivement cet itinéraire en plaçant ce qui suit avant devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
Cela fonctionne, mais j'imagine qu'il y a une meilleure façon, non?
Mettre à jour
Comme l'a dit Benoit Garret, la meilleure solution dans mon cas est de ne pas créer les routes d'inscription en masse et de simplement créer celles que je veux réellement.
Pour ce faire, j'ai d'abord couru rake routes
, puis utilisé la sortie pour recréer celles que je voulais. Le résultat final était le suivant:
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
Notez que:
- J'ai encore
:registerable
dans monUser
modèle devise/registrations
gère la mise à jour de l'email et du mot de passe- La mise à jour d'autres attributs utilisateur - autorisations, etc. - est gérée par un autre contrôleur
Réponse réelle:
Supprimez la route pour les chemins de Devise par défaut; c'est à dire:
devise_for :users, path_names: {
sign_up: ''
}
la source
https://example.com/users/
. Voir ma réponse ci-dessous.Réponses:
J'ai essayé de le faire aussi, mais un fil de discussion sur le groupe Google de conception m'a dissuadé de rechercher une solution vraiment propre.
Je citerai José Valim (le mainteneur de Devise):
La question initiale était:
la source
:skip => :registrations
pas le cas:skip => :registerable
.vous pouvez le faire dans votre modèle
changez-le en:
notez que le symbole a
:registerable
été suppriméVoilà, rien d'autre n'est requis. Tous les itinéraires et liens vers la page d'inscription sont également supprimés par magie.
la source
edit_user_registration
, dont j'ai besoin. Comme je l'ai dit, "ils devraient toujours pouvoir modifier leurs profils".localhost:3000/admin
là où ils peuvent modifier leur compte, même avec l'objet résistant supprimé. Si ce n'est pas une solution viable, jetez un œil à CanCan qui vous permet de préciser qui peut et qui ne peut pas accéder à une ressource. J'ai tendance à ajouter des rôles tels que «admin» ou «moderator» et à verrouiller tout le monde hors des pages de connexion.sign_in
en production?J'ai eu un problème similaire essayé de supprimer les chemins de devise_invitable pour create et new :
avant:
routes de râteau
après
routes de râteau
note 1 périmètre de conception https://github.com/plataformatec/devise#configuring-routes
note 2 Je l'applique sur devise_invitable mais cela fonctionnera avec n'importe quelle fonctionnalité de périphérique * capable
Remarque importante: voyez-vous que devise_scope est sur user pas users ? c'est correct, attention à ça! Cela peut causer beaucoup de douleur en vous donnant ce problème:
la source
J'ai trouvé un autre article similaire à celui-ci et je voulais partager une réponse donnée par @chrisnicola. Dans le message, ils tentaient de bloquer uniquement les inscriptions des utilisateurs pendant la production.
Vous pouvez également modifier le contrôleur des inscriptions. Vous pouvez utiliser quelque chose comme ceci:
Dans "app / controllers / registrations_controller.rb"
Cela remplacera le contrôleur de l'appareil et utilisera les méthodes ci-dessus à la place. Ils ont ajouté des messages flash au cas où quelqu'un accédait d'une manière ou d'une autre à la page d'inscription. Vous devriez également pouvoir changer la redirection vers n'importe quel chemin que vous aimez.
Aussi dans "config / routes.rb", vous pouvez ajouter ceci:
Le laisser ainsi vous permettra d'utiliser le modèle standard pour modifier votre profil. Si vous le souhaitez, vous pouvez toujours remplacer l'option de modification du profil en incluant
dans le "app / controllers / registrations_controller.rb"
la source
C'est une vieille question - mais j'ai récemment résolu le même problème et proposé une solution beaucoup plus élégante que:
Et il donne les noms par défaut des routes nommées (comme
cancel_user_registration
) sans être excessivement verbeux.rake routes
sortie avec les modules de périphérique par défaut:la source
Vous pouvez surcharger "devise_scope" en le plaçant avant "devise_for".
Je ne sais pas si c'est le meilleur moyen, mais c'est ma solution actuellement, car il redirige simplement vers la page de connexion.
la source
/users/sign_up
vous aurez accès à l' adressesites#index
nonsign_up
mais toujours restée/users/sign_up
.J'ai aimé la réponse de @ max , mais en essayant de l'utiliser, j'ai rencontré une erreur car elle
devise_mapping
était nulle.J'ai légèrement modifié sa solution pour en faire une qui semble résoudre le problème. Il fallait encapsuler l'appel à l'
resource
intérieurdevise_scope
.Notez que
devise_scope
attend le singulier:user
alors queresource
attend le pluriel:users
.la source
Faites ceci dans routes.rb
vous obtiendrez une erreur maintenant pendant que vous viendrez à la page de connexion, pour le corriger. Effectuez cette modification dans: app / views / devise / shared / _links.erb
la source
devise_for
et leas
bloc) et j'ai dû supprimer:registerable
le modèle.J'ai trouvé que cela fonctionnait bien sans jouer avec les routes ni ajouter des méthodes de contrôleur d'application. Mon approche consiste à remplacer la méthode de conception. Ajoutez ceci à
app/controllers/devise/registrations_controller.rb
j'ai omis les autres méthodes par souci de concision.Aussi pour supprimer l'illusion que ce chemin est toujours accessible à partir d'autres vues, vous pouvez également supprimer ce code de
app/views/devise/shared/_links.erb
la source
Pour d'autres dans mon cas.
Avec
devise (3.5.2)
.J'ai supprimé avec succès les itinéraires d'inscription, mais j'ai conservé ceux pour modifier le profil, avec le code suivant.
la source
Voici l'itinéraire légèrement différent que j'ai emprunté. Cela permet de ne pas avoir à remplacer la
devise/shared/_links.html.erb
vue.Dans
app/models/user.rb
:Dans
config/routes.rb
:Avant:
Après:
la source
devise_for :users, skip: :all
J'ai eu le même problème et j'ai trouvé une mauvaise pratique de rediriger les utilisateurs depuis la page d'inscription. Donc, ma solution est essentiellement de ne pas utiliser
:registrable
du tout.Ce que j'ai fait, c'est de créer une page similaire comme modifier les détails de l'utilisateur qui ressemblait à:
Donc, ce formulaire se soumet à un nouveau point de fin de publication qui met à jour le mot de passe, qui ressemble à:
Plus tard, vous pouvez utiliser
@result
dans votre vue pour indiquer à l'utilisateur si le mot de passe est mis à jour ou non.la source
En modifiant les itinéraires, il y a toute une série d'autres problèmes qui en découlent. La méthode la plus simple que j'ai trouvée est de faire ce qui suit.
la source
Vous pouvez modifier la
devise
gemme elle-même. Tout d'abord, exécutez cette commande pour trouver l'emplacement d'installation de using:gem which devise
Supposons que le chemin soit:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Ensuite aller à
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
et éditezroutes.rb
dans ce répertoire. Il existe une méthode appeléedef devise_registration(mapping, controllers)
que vous pouvez modifier pour vous débarrasser de la nouvelle action. Vous pouvez également supprimer complètement les mappages pourdevise_registration
la source
gem 'devise', github: 'yourusername/devise', branch: "master"
)