web-dev-qa-db-ja.com

rails:3 Devise signupフィルターチェーンが:require_no_authenticationがレンダリングまたはリダイレクトされたため停止しました

私は自分のサイトでDeviseを使用しています。管理ネームスペースを作成し、管理者によるユーザー作成機能を提供しています。
私のルートは以下の通りです

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

signup_pathがあるadd_userリンクをクリックすると、次のエラーが発生します。

私のエラー

 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)

私はそれがデバイス登録コントローラーに行くと思うが、次の行のためにデバイス登録コントローラーにエラーが発生する

prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
33
urjit on rails

Deviseのコントローラーに記載されている行は、一般的な場合に意味があります。ログインしているユーザーはサインアップできません。管理者だけがユーザーを作成できる場合は、RegisterableモジュールでDeviseのコントローラーを使用せず、独自のルールで独自のコントローラーを作成することをお勧めします。上記の行のみを変更するDeviseのコントローラーに基づいて記述できます。

使用したい場合は、before_filterskip_before_filterをスキップしてみてください。私はそれが最善の解決策だとは思わない。そして、私は自分のコントローラーを書くでしょう。

31
Rodrigo Flores

開発ログで次のエラーを受け取りました。

Filter chain halted as :require_no_authentication

Application_controller.rbのdeviseのafter_sign_in_path_forが前のページにリダイレクトされていたため、無限ループが作成されました

stored_location_for(resource)

Deviseのgemは、パスワードが編集されるとユーザーにサインインします。

8
NateGreat8

あなたのように、管理者ユーザーに新しいユーザーを追加できるようにしたかったのです。しかし、実際にユーザーが自分で登録できるようにしたかったので、私はDevise Registerableを台無しにしたくありませんでした。新しいユーザーを追加する権限を持つ管理ユーザーがいるので、ユーザーコントローラーに追加のメソッドと、そのケースを処理するための追加のビューを作成しました。

私の追加メソッドはDeviseのprepend_before_filter:require_no_authenticationによって参照されないため、エラーは発生しません。

私のレシピ:

App/controllers/users_controller.rb(またはdeviseを使用しているオブジェクト):new、create、およびupdateメソッドをコピーし、コピーの名前をadmin_new、admin_create、およびadmin_updateに変更します。

App/views/usersで、new.html.erbをadmin_new.html.erbにコピーします。フォームの代わりにadmin_formを参照するようにパーシャルを変更します。

 <%= render 'admin_form' %>

次に、部分的な_form.html.erbを_admin_form.html.erbにコピーします。 _admin_form.html.erbで、form_forを変更して別のURLを使用します。

form_for(@user, :url => '/users/admin_create')

Config/routes.rbにルートを追加して、ユーザーコントローラーの代替メソッドを指定します。

devise_scope :user  do
    ...
    get  'users/admin_new' => 'users#admin_new'
    post 'users/admin_create' => 'users#admin_create'
end

これで、ログイン中に/ users/admin_newにアクセスしてユーザーを追加できます。ユーザーは、邪魔していない工夫のメカニズムを使用して独自のユーザー(登録)を作成できます。

6
Don Law

こんにちはみんな、私はさらに簡単なソリューションを得ました:

prepend_before_filter :require_no_authentication, only: [:cancel ]

:new, :createからprepend_before_filterを削除することにより、ソースコードの工夫を無効にして問題を解決します。私は同じ問題を抱えていて、それが私の問題を解決しました。

5
Antoine