2012-03-09 1 views
32

私のサイトでDeviseを使用しています。管理者の名前空間を作成し、管理者による管理者の作成機能を提供しています。 rails:3デビズサインアップフィルタチェーンが次のように停止しました:require_no_authenticationレンダリングまたはリダイレクト

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 ] 
+6

ログインしているユーザーがいないことを確認してください。ログアウト(またはドメインのCookieをクリーンアップ)し、動作するかどうか確認してください。 –

+0

はい、私は管理者としてログインしました。管理者はユーザーを追加できるので、ユーザーページの追加(登録)は開いて、localhost:3000/adminにリダイレクトできません。 –

+0

私は問題はprepend_before_filter:require_no_authentication、:only => [:new、:create、:cancel]と言っています。私はヘルパーでrequire_no_authenticationメソッドを持っていますか? –

答えて

30

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

before_filterをスキップしてみてください。skip_before_filterを使用してください。私はそれが最善の解決策だとは思わない。私は自分自身のコントローラを書くだろう。

8

開発ログに次のエラーが表示されていました。

Filter chain halted as :require_no_authentication 

パスワードが編集されたときapplication_controller.rbで工夫のafter_sign_in_path_forは、ユーザーで

stored_location_for(resource) 

考案の宝石記号で前のページにリダイレクトされたため、無限ループが作成されました。

6

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

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

マイレシピ:

アプリ/コントローラ/ users_controller.rbで

(あなたのために工夫を使用しているか、どんなオブジェクト): コピー新しい、作成および更新方法をしてadmin_newするコピーの名前を変更し、admin_create、およびadmin_update 。アプリ/ビュー/ユーザーで

、代わりにフォームのadmin_formを参照するために、部分的に変更しadmin_new.html.erbするコピーnew.html.erb:

<%= render 'admin_form' %> 

その後、部分的_form.html.erbをコピーします_admin_form.html.erbに移動します。 _admin_form.html.erbで、別のURLを使用するようにform_forを変更します。

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

設定/ルートにルートを追加します。ユーザーコントローラ内の別の方法を指すようにRB:あなたは/ユーザー/ admin_newに移動してログインし、ユーザーがまだ自分のユーザーを作成することができますされている間、今、あなたはユーザーを追加することができます

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

(登録)あなたが邪魔していない創造機構を使ってそれは、ソースコードを工夫して、問題を解決するよりも優先されますprepend_before_filterから:new, :createを除去することにより

prepend_before_filter :require_no_authentication, only: [:cancel ] 

+0

あなたの回避策は大きな問題を解決しました、ドン・ロー。ありがとう! 1つのライナーの –

5

こんにちはみんなは私も簡単な解決策を得ました。私は同じ問題を抱えていて、私の問題を解決しました。

+0

。 +1することは簡潔です。 – Jerome

+0

@antoineどこにこのコードを追加しますか?もう少し説明することができます –

+1

@pawankumar 'Registrations :: RegistrationsController'クラスを使用してDevise登録を行う方法があります。その中に、最初の行には ' prepend_before_filter:require_no_authenticationのみ:[:cancel] 'という状態があります。 – Jerome