0

私は小さな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 controllerCustom 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

更新: 正しいトレース出力に貼り付けました。

4

1 に答える 1

3

したがって、1つの解決策は追加することです

  devise_scope :user do
    get '/users/new' => 'registrations#new'
  end

routes.rb に。これは最良の答えではないかもしれませんが、うまくいきます。

于 2012-07-26T02:27:33.403 に答える