私は自分のサイトで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 ]
Deviseのコントローラーに記載されている行は、一般的な場合に意味があります。ログインしているユーザーはサインアップできません。管理者だけがユーザーを作成できる場合は、Registerable
モジュールでDeviseのコントローラーを使用せず、独自のルールで独自のコントローラーを作成することをお勧めします。上記の行のみを変更するDeviseのコントローラーに基づいて記述できます。
使用したい場合は、before_filter
でskip_before_filter
をスキップしてみてください。私はそれが最善の解決策だとは思わない。そして、私は自分のコントローラーを書くでしょう。
開発ログで次のエラーを受け取りました。
Filter chain halted as :require_no_authentication
Application_controller.rbのdeviseのafter_sign_in_path_forが前のページにリダイレクトされていたため、無限ループが作成されました
stored_location_for(resource)
Deviseのgemは、パスワードが編集されるとユーザーにサインインします。
あなたのように、管理者ユーザーに新しいユーザーを追加できるようにしたかったのです。しかし、実際にユーザーが自分で登録できるようにしたかったので、私は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にアクセスしてユーザーを追加できます。ユーザーは、邪魔していない工夫のメカニズムを使用して独自のユーザー(登録)を作成できます。
こんにちはみんな、私はさらに簡単なソリューションを得ました:
prepend_before_filter :require_no_authentication, only: [:cancel ]
:new, :create
からprepend_before_filter
を削除することにより、ソースコードの工夫を無効にして問題を解決します。私は同じ問題を抱えていて、それが私の問題を解決しました。