私は小さなRailsアプリにデバイスを構築しています。これはかなり標準的なセットアップですが、このプロジェクトではデフォルトの認証ルールを変更する必要があるという問題があります。冪等でない登録アクションはすべて、認証されたユーザーのみに制限する必要があります。
これを行うために、カスタム登録コントローラーを作成し、ルーティングにリンクしました。カスタム コントローラが実際に行う必要があるのは、フィルタリング要件を変更することだけです。Rails コントローラーのフィルタリングに関するドキュメントに基づいて、最小限の労力でこれを機能させることができました。
ただし、それ自体は /users/sign_up や /users/edit などのデバイス固有のアクションにのみ適用されます。また、標準の Rails アクション (/users/new、/users/1/edit など) をカスタム コントローラーに接続したいと考えています。コントローラーをインスタンス化するアクションを取得できます-いわば馬を水に導きます-しかし、アクションがsign_upではなく新しい場合、フィルタリング中にクラッシュします。
問題は、アクションが 'new' の場合は resource_name が nil を生成するように見えますが、'sign_up' の場合は問題ありません。なぜdeviseが気にするのか、コードのどこで区別が表されているのかわかりません。Update the User controller of deviseやOverride devise registrations controllerとCustom Devise controllerなどの他の質問を見てきましたが、この問題には触れていません。
私が得ている特定のエラーは
RegistrationsController#new の NoMethodError
nil:NilClass の未定義のメソッド `name'
トレースの上部は
devise (2.1.2) app/controllers/devise_controller.rb:22:in
resource_name' app/controllers/registrations_controller.rb:104:in
authenticate_scope!」
初めてdevise_mappingが参照されたときに明らかに発生しています。しかし、上記のstackoverflowの質問に従って、devise_mappingのヘルパーも明示的に提供しましたが、それらは呼び出されません。
誰かが説明したり、さらにどこを見ればよいかを理解するのを手伝ってくれますか?
routes.rb から:
Fs::Application.routes.draw do
devise_for :users, :controllers => { :registrations => 'registrations' }
resources :users, :except => [:index, :show], :controller => 'registrations'
resources :users, :only => [:index, :show]
[...]
rake ルート レポート:
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) registrations#cancel
user_registration POST /users(.:format) registrations#create
new_user_registration GET /users/sign_up(.:format) registrations#new
edit_user_registration GET /users/edit(.:format) registrations#edit
PUT /users(.:format) registrations#update
DELETE /users(.:format) registrations#destroy
users POST /users(.:format) registrations#create
new_user GET /users/new(.:format) registrations#new
edit_user GET /users/:id/edit(.:format) registrations#edit
user PUT /users/:id(.:format) registrations#update
DELETE /users/:id(.:format) registrations#destroy
GET /users(.:format) users#index
GET /users/:id(.:format) users#show
私の registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
prepend_before_filter :authenticate_scope!, :except => [:index, :show]
skip_filter :require_no_authentication
end
私の users_helper.rb:
module UsersHelper
# used by devise
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
end
使用:
レール 3.2.6
ルビー1.9.3
工夫2.1.2
更新: 正しいトレース出力に貼り付けました。