私は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 _ 4534346825225857812__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
必ずdevise_for :user
をroutes.rb
に追加してください
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を再起動しない限り、コードを再度有効にしても問題は解決しません。
うまくいかないことがたくさんあります。順番に確認するいくつかの事項:
before_filter :authenticate_user!
を呼び出せない場合は、デバイスが正しく設定されていないことを示しています。devise_for :users
を追加します(これはuser sです。これで問題ありません)。次に、スコープルールをテスト用に簡略化します。before_filter :authenticate_user!
を機能させる必要がありますhelper_method "current_user", "user_signed_in?", "user_session"
self.controller.current_user
はerbで機能しますか?これは、helper_methodsが含まれていないことを示します。私は私のコントローラーにこの行を追加しました:
include Devise::Controllers::Helpers
Deviseのスタートガイドに従っても同じ問題が発生しました。
Rails generate model User
ではなくRails generate devise User
を誤って実行したことがわかりました。これにより、たまたま 'User'という名前のプレーンなActiveRecordモデルが作成されました。
私は同じ問題(Rails 5.1.2、Devise 4.3.0)を抱えていて、たまたま私が使っていたのは:-
devise_for :user do
...
end
の代わりに
devise_for :users do
...
end
名前空間を変更して修正しました。
ユーザー=>ユーザー