web-dev-qa-db-fra.com

rails: 3 Devise signup Chaîne de filtres arrêtée comme: require_no_authentication rendue ou redirigée

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 ]
33
urjit on rails

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.

31
Rodrigo Flores

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é.

8
NateGreat8

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é.

6
Don Law

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.

5
Antoine