J'utilise Devise dans mon site Je crée un espace de noms administrateur et donne la fonctionnalité de création d'utilisateur par administrateur.
mes itinéraires sont comme sous
devise_for :users,:has_many => :comments, :controllers => {:sessions =>'devise/sessions',:registrations => 'devise/registrations'} do
get "/login", :to => "devise/sessions#new", :as => :login
get "/signup", :to => "devise/registrations#new", :as => :signup
get "/logout", :to => "devise/sessions#destroy", :as => :logout
end
quand je clique sur le lien add_user qui a signup_path
provoquant l'erreur suivante:
Mon erreur
Started GET "/signup" for 127.0.0.1 at Fri Mar 09 12:49:11 +0530 2012
Processing by Devise::RegistrationsController#new as HTML
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 35 LIMIT 1
Redirected to http://localhost:3000/admin
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 3ms (ActiveRecord: 0.1ms)
Je pense que cela va au contrôleur d'enregistrement de devise, mais en raison de la ligne suivante, cela provoque une erreur dans le contrôleur d'enregistrement de devise
prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
La ligne mentionnée sur le contrôleur de Devise est logique dans les cas généraux: un utilisateur connecté ne peut pas s'inscrire. Comme vous êtes dans un cas où seul un administrateur peut créer un utilisateur, je vous suggère de ne pas utiliser le contrôleur de Devise sur le module Registerable
et d'écrire votre propre contrôleur avec vos propres règles. Vous pouvez l'écrire sur la base du contrôleur de Devise qui ne modifie que la ligne mentionnée.
Si vous souhaitez l'utiliser, essayez de sauter le before_filter
avec skip_before_filter
. Je ne pense pas que ce soit la meilleure solution. et j'écrirais mon propre contrôleur.
Je recevais l'erreur suivante dans mon journal de développement.
Filter chain halted as :require_no_authentication
Une boucle sans fin a été créée car after_sign_in_path_for de devise dans application_controller.rb était en train de rediriger vers la page précédente avec
stored_location_for(resource)
Le bijou de Devise signe l'utilisateur lorsque le mot de passe est modifié.
Comme vous, je voulais qu'un utilisateur Admin puisse ajouter de nouveaux utilisateurs. Mais je ne voulais pas jouer avec le Devise Registerable, car je voulais en fait que les utilisateurs puissent toujours s'enregistrer eux-mêmes. J'ai certains utilisateurs administrateurs autorisés à ajouter un nouvel utilisateur, j'ai donc créé des méthodes supplémentaires dans le contrôleur de mes utilisateurs et des vues supplémentaires pour gérer ce cas.
Mes méthodes supplémentaires ne sont pas référencées par prepend_before_filter de Devise: require_no_authentication, donc elles n'obtiennent pas l'erreur.
Ma recette:
Dans app/controllers/users_controller.rb (ou tout autre objet que vous utilisez pour concevoir): copiez les nouvelles méthodes, créez et mettez à jour et renommez les copies en admin_new, admin_create et admin_update.
Dans app/views/users, copiez new.html.erb vers admin_new.html.erb Modifiez le partiel pour faire référence à admin_form au lieu du formulaire:
<%= render 'admin_form' %>
Copiez ensuite le _form.html.erb partiel dans _admin_form.html.erb. Dans _admin_form.html.erb, modifiez le form_for pour utiliser une URL différente:
form_for(@user, :url => '/users/admin_create')
Ajoutez des routes dans config/routes.rb pour pointer vers les autres méthodes dans le contrôleur utilisateur:
devise_scope :user do
...
get 'users/admin_new' => 'users#admin_new'
post 'users/admin_create' => 'users#admin_create'
end
Vous pouvez maintenant ajouter des utilisateurs lorsque vous êtes connecté en accédant à/users/admin_new, et les utilisateurs peuvent toujours créer leur propre utilisateur (s'inscrire) en utilisant le mécanisme de conception que vous n'avez pas dérangé.
Salut les gars, j'ai une solution encore plus simple:
prepend_before_filter :require_no_authentication, only: [:cancel ]
En retirant :new, :create
du prepend_before_filter
il remplace le code source et résout le problème. J'ai eu le même problème et cela a résolu mon problème.