web-dev-qa-db-ja.com

Deviseヘルパー(authenticate_user!、current_user、user_signed_in?)が初期化されていません

私はdeviseをセットアップしています。deviseヘルパーを使用できるようにする必要があります。アプリケーションコントローラにbefore_filter :authenticate_user!を追加すると、次のエラーundefined method 'authenticate_user!' for #<HomeController:*>が発生します

ホームコントローラーには直接存在しませんが、アプリケーションコントローラーから継承されます。ホーム(または任意のコントローラー)でskip_before_filter :authenticate_user!を使用してページにアクセスしようとすると、次のエラーが発生します。

undefined method `user_signed_in?' for #<#<Class *>

それは、それを呼び出すlayouts/application.html.erbファイル内の行で中断します。同じことがヘルパーのいずれにも起こります。まったくロードされていないように見えますが、Rails consoleをロードして$LOAD_PATH.dupと入力すると、含まれている出力が

 "/usr/local/rvm/gems/Ruby-1.9.3-p429/gems/devise-2.2.4/lib", "/usr/local/rvm/gems/Ruby-1.9.3-p429/gems/devise-2.2.4/app/controllers", "/usr/local/rvm/gems/Ruby-1.9.3-p429/gems/devise-2.2.4/app/helpers", "/usr/local/rvm/gems/Ruby-1.9.3-p429/gems/devise-2.2.4/app/mailers" 

したがって、それらは実際にRailsによってロードされる必要があるようです。

これは私のアプリケーションコントローラです

クラスApplicationController <ActionController :: Base

helper:all#常にすべてのヘルパーを含める
protect_from_forgery
ActionView :: Helpers :: NumberHelperを含める
before_filter:authenticate_user!

終わり

Deviseのインストール後にサーバーを再起動しましたが、問題を解決するためにさまざまな試みを何度も試しました。さらにファイルや情報が必要な場合はお知らせください。事前にどうもありがとうございました。

編集:私のuser.rbファイルは、私が実際にdeviseをインストールしたことを示すように要求されました

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :encryptable, :encryptor => :restful_authentication_sha1  

  # Setup accessible (or protected) attributes for your model  
  attr_accessible :email, :password, :password_confirmation, :remember_me  

end

編集:エラーメッセージ全体

HomeController#indexのNoMethodError

未定義のメソッド「authenticate_user!」 #<HomeController:0x000000040c45a0> '

ここに完全なトレースがあります

activesupport(3.2.13)lib/active_support/callbacks.rb:418:in `run _ 2094683035699451847__process_action _222954693128915811 _ callbacks '

activesupport(3.2.13)lib/active_support/callbacks.rb:405:in `__run_callback '

activesupport(3.2.13)lib/active_support/callbacks.rb:385:in> `_run_process_action_callbacks '

activesupport(3.2.13)lib/active_support/callbacks.rb:81:in `run_callbacks '

actionpack(3.2.13)lib/abstract_controller/callbacks.rb:17:in `process_action '

actionpack(3.2.13)lib/action_controller/metal/rescue.rb:29:in `process_action '

actionpack(3.2.13)lib/action_controller/metal/instrumentation.rb:30:in `block in process_action '

activesupport(3.2.13)lib/active_support/notifications.rb:123:in `block in instrument '

activesupport(3.2.13)lib/active_support/notifications/instrumenter.rb:20:in `instrument '

activesupport(3.2.13)lib/active_support/notifications.rb:123:in `instrument '

actionpack(3.2.13)lib/action_controller/metal/instrumentation.rb:29:in `process_action '

actionpack(3.2.13)lib/action_controller/metal/params_wrapper.rb:207:in `process_action '

actionpack(3.2.13)lib/abstract_controller/base.rb:121:in `process '

actionpack(3.2.13)lib/abstract_controller/rendering.rb:45:in `process '

actionpack(3.2.13)lib/action_controller/metal.rb:203:in `dispatch '

actionpack(3.2.13)lib/action_controller/metal/rack_delegation.rb:14:in `ディスパッチ '

actionpack(3.2.13)lib/action_controller/metal.rb:246:in `block in action '

actionpack(3.2.13)lib/action_dispatch/routing/route_set.rb:73:in `call '

actionpack(3.2.13)lib/action_dispatch/routing/route_set.rb:73:in `dispatch '

actionpack(3.2.13)lib/action_dispatch/routing/route_set.rb:36:in `call '

ジャーニー(1.0.4)lib/journey/router.rb:68:in `block in call '

ジャーニー(1.0.4)lib/journey/router.rb:56:in `each '

ジャーニー(1.0.4)lib/journey/router.rb:56:in `call '

actionpack(3.2.13)lib/action_dispatch/routing/route_set.rb:612:in `call '

warden(1.2.1)lib/warden/manager.rb:35:in「呼び出し中のブロック」

warden(1.2.1)lib/warden/manager.rb:34:in `catch '

warden(1.2.1)lib/warden/manager.rb:34:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/best_standards_support.rb:17:in `call '

ラック(1.4.5)lib/rack/etag.rb:23:in `call '

ラック(1.4.5)lib/rack/conditionalget.rb:25:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/head.rb:14:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/params_parser.rb:21:in `call '

actionpack(3.2.13)lib/action_dispatch/middleware/flash.rb:242:in `call '

ラック(1.4.5)lib/rack/session/abstract/id.rb:210:in `context '

ラック(1.4.5)lib/rack/session/abstract/id.rb:205:in `call '

actionpack(3.2.13)lib/action_dispatch/middleware/cookies.rb:341:in `call '

activerecord(3.2.13)lib/active_record/query_cache.rb:64:in `call '

activerecord(3.2.13)lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call '

actionpack(3.2.13)lib/action_dispatch/middleware/callbacks.rb:28:in `block in call '

activesupport(3.2.13)lib/active_support/callbacks.rb:405:in `run _ 177144612565476380 _call _ 45​​34346825225857812__callbacks '

activesupport(3.2.13)lib/active_support/callbacks.rb:405:in `__run_callback '

activesupport(3.2.13)lib/active_support/callbacks.rb:385:in `_run_call_callbacks '

activesupport(3.2.13)lib/active_support/callbacks.rb:81:in `run_callbacks '

actionpack(3.2.13)lib/action_dispatch/middleware/callbacks.rb:27:in `call '

actionpack(3.2.13)lib/action_dispatch/middleware/reloader.rb:65:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/remote_ip.rb:31:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/show_exceptions.rb:56:in `call '

railties(3.2.13)lib/Rails/rack/logger.rb:32:in `call_app '

railties(3.2.13)lib/Rails/rack/logger.rb:16:in `block in call '

activesupport(3.2.13)lib/active_support/tagged_logging.rb:22:in `tagged '

railties(3.2.13)lib/Rails/rack/logger.rb:16:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/request_id.rb:22:in `call '

ラック(1.4.5)lib/rack/methodoverride.rb:21:in `call '

ラック(1.4.5)lib/rack/runtime.rb:17:in `call '

activesupport(3.2.13)lib/active_support/cache/strategy/local_cache.rb:72:in `call '

ラック(1.4.5)lib/rack/lock.rb:15:in `call '

アクションパック(3.2.13)lib/action_dispatch/middleware/static.rb:63:in `call '

railties(3.2.13)lib/Rails/engine.rb:479:in `call '

railties(3.2.13)lib/Rails/application.rb:223:in `call '

railties(3.2.13)lib/Rails/railtie/configurable.rb:30:in `method_missing '

乗客(4.0.2)lib/phusion_passenger/rack/thread_handler_extension.rb:77:in `process_request '

乗客(4.0.2)lib/phusion_passenger/request_handler/thread_handler.rb:135:in `accept_and_process_next_request '

乗客(4.0.2)lib/phusion_passenger/request_handler/thread_handler.rb:106:in `main_loop '

乗客(4.0.2)lib/phusion_passenger/request_handler.rb:449:in `start_threadsのブロック(4レベル) '

乗客(4.0.2)lib/phusion_passenger/utils/robust_interruption.rb:108:in `disable_interruptions '

乗客(4.0.2)lib/phusion_passenger/request_handler.rb:444:in `block(3 levels)in start_threads '

編集:これは、コンソールでDevise.helpersを実行したときのテキストです。

$ Railsコンソール

開発環境のロード(Rails 3.2.13)

1.9.3-p429:001> Devise.helpers

=>#<セット:{Devise :: Controllers :: Helpers}>

編集:これは私のルートのrbファイルです。 :Application.routes.draw do

devise_for :users  

resource :sessions, :only => [:new, :create, :destroy]

devise_scope :user do
    match 'signup' => 'users#new', :as => :signup
    match 'register' => 'users#create', :as => :register
    match '/login' => 'sessions#new', :as => :login 
     match 'logout' => 'sessions#destroy', :as => :logout
end
match '/activate/:activation_code' => 'users#activate', :as => :activate, :activation_code => nil

match '/users/:id', :to => 'users#show', :as => :user

resources :users do

member do
     put :suspend
     put :unsuspend
     delete :purge
end

end

resource :sessions

   other resources

match '' => 'home#index', :as => :home
match ':controller(/:action(/:id))'
root to: 'home#index'
end 
19
Btuman

必ずdevise_for :userroutes.rbに追加してください

詳細はこちら: https://stackoverflow.com/a/11180576

32
paulguy

Railsサーバーを再起動してください。

「すでにアプリを起動している場合は、ここでアプリを再起動する必要があります。それ以外の場合は、ユーザーがログインできない、ルートヘルパーが定義されていないなどの奇妙なエラーが発生します。」 [はじめに]

[編集]より詳細な答え:

さらに2つのことを確認してください。HomeControllerはDevise :: Controllers :: Helpersから継承する必要があります。そして、route.rbのdeviseディレクティブ(ヘルパーで不足しているメソッドを生成する)は、Devise。@@ mappingsを拡張する必要があります。次のコードでこれを確認できます。

class ApplicationController ...
  ...
  before_filter do
    fail "bad ancestor" unless self.kind_of?(Devise::Controllers::Helpers)
    fail "no mapping" unless Devise.class_variable_get(:@@mappings).[:user]
    authenticate_user!
  end
end

動作中のアプリケーションに同様の問題を導入するには、Railsアプリケーションのconfig/initializers/devise.rbおよびconfig/routes.rb deviseエントリを無効にし、Rails =再起動する必要があります。Railsを再起動しない限り、コードを再度有効にしても問題は解決しません。

6
kunysch

うまくいかないことがたくさんあります。順番に確認するいくつかの事項:

  • before_filter :authenticate_user!を呼び出せない場合は、デバイスが正しく設定されていないことを示しています。
  • Routes.rbにdevise_for :usersを追加します(これはuser sです。これで問題ありません)。次に、スコープルールをテスト用に簡略化します。
  • コントローラーにヘルパーを取得するか、ヘルパーを手動で含めるには、before_filter :authenticate_user!を機能させる必要があります
  • 基本コントローラがActionControllerを継承しない場合は、ヘルパーメソッドを手動で追加する必要があります。これを基本コントローラに配置しますhelper_method "current_user", "user_signed_in?", "user_session"
  • 確認すること:self.controller.current_userはerbで機能しますか?これは、helper_methodsが含まれていないことを示します。
2

私は私のコントローラーにこの行を追加しました:

include Devise::Controllers::Helpers
1
AmitF

Deviseのスタートガイドに従っても同じ問題が発生しました。

Rails generate model UserではなくRails generate devise Userを誤って実行したことがわかりました。これにより、たまたま 'User'という名前のプレーンなActiveRecordモデルが作成されました。

0
Niek

私は同じ問題(Rails 5.1.2、Devise 4.3.0)を抱えていて、たまたま私が使っていたのは:-

devise_for :user do
  ...
end

の代わりに

devise_for :users do
  ...
end

名前空間を変更して修正しました。

ユーザー=>ユーザー

0
Roshan