web-dev-qa-db-fra.com

Devise Helpers (authenticate_user !, utilisateur actuel, user_signed_in?) Non initialisé

Je suis en train de mettre en place le système et je dois être capable d’utiliser les assistants du système. Lorsque j'ajoute before_filter :authenticate_user! dans le contrôleur d'application, l'erreur suivante undefined method 'authenticate_user!' for #<HomeController:*>

Il n’est pas présent dans mon contrôleur domestique directement, mais hérité du contrôleur d’application, si j’utilise skip_before_filter :authenticate_user! dans mon domicile (ou n’importe quel contrôleur) et que je tente d’accéder à la page, l’erreur suivante.

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

Il se rompt sur la ligne qui l’appelle dans le fichier layouts/application.html.erb. Les mêmes choses se produisent pour tous les assistants. On dirait qu’ils ne sont pas chargés du tout, cependant, lorsque j’ai chargé la console Rails, et que j’ai entré $LOAD_PATH.dup la sortie incluse.

 "/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" 

Il semble donc qu’ils devraient effectivement être chargés par Rails.

Ceci est mon contrôleur d'application

classe ApplicationController <ActionController :: Base

helper: all # inclut tous les assistants, tout le temps
protect_from_forgery
inclut ActionView :: Helpers :: NumberHelper
before_filter: authenticate_user!

fin

J'ai redémarré le serveur après avoir installé le logiciel et plusieurs fois au cours de différentes tentatives pour résoudre le problème. Si vous avez besoin de plus de fichiers ou d'informations, faites-le moi savoir. Merci beaucoup d'avance.

Edit: Mon fichier user.rb a été demandé pour montrer que j’ai bien installé

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

Edit: le message d'erreur entier

NoMethodError dans HomeController # index

méthode non définie `authenticate_user! ' pour # <HomeController: 0x000000040c45a0> '

Voici la trace complète

actifsupport (3.2.13) lib/active_support/callbacks.rb: 418: dans `run _ 20946830359999181847__process_action _222954693128915811 _ callbacks '

actifsupport (3.2.13) lib/active_support/callbacks.rb: 405: dans `__run_callback '

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

actifsupport (3.2.13) lib/active_support/callbacks.rb: 81: dans `run_callbacks '

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

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

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

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

actifsupport (3.2.13) lib/active_support/notifications/instrumenter.rb: 20: dans `instrument '

actifsupport (3.2.13) lib/active_support/notifications.rb: 123: dans `instrument '

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

actionpack (3.2.13) lib/action_controller/metal/params_wrapper.rb: 207: dans `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: dans `dispatch '

actionpack (3.2.13) lib/action_controller/metal/rack_delegation.rb: 14: dans `dispatch '

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

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

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

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

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

journey (1.0.4) lib/journey/router.rb: 56: dans `each '

journey (1.0.4) lib/journey/router.rb: 56: dans `call '

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

gardien (1.2.1) lib/warden/manager.rb: 35: in `block in call '

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

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

actionpack (3.2.13) lib/action_dispatch/middleware/best_standards_support.rb: 17: dans `call '

rack (1.4.5) lib/rack/etag.rb: 23: dans `call '

rack (1.4.5) lib/rack/conditionalget.rb: 25: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/head.rb: 14: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/params_parser.rb: 21: dans `call '

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

rack (1.4.5) lib/rack/session/abstract/id.rb: 210: dans le "contexte"

rack (1.4.5) lib/rack/session/abstract/id.rb: 205: dans `call '

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

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

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

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

actifsupport (3.2.13) lib/active_support/callbacks.rb: 405: dans `exécution _ 177144612565476380 _appel _ 4534346825225857812__callbacks '

actifsupport (3.2.13) lib/active_support/callbacks.rb: 405: dans `__run_callback '

actifsupport (3.2.13) lib/active_support/callbacks.rb: 385: dans `_run_call_callbacks '

actifsupport (3.2.13) lib/active_support/callbacks.rb: 81: dans `run_callbacks '

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

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

actionpack (3.2.13) lib/action_dispatch/middleware/remote_ip.rb: 31: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb: 16: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/show_exceptions.rb: 56: dans `call '

rails (3.2.13) lib/Rails/rack/logger.rb: 32: dans `call_app '

railties (3.2.13) lib/Rails/rack/logger.rb: 16: en "bloc en appel"

actifsupport (3.2.13) lib/active_support/tagged_logging.rb: 22: dans `tagged '

rails (3.2.13) lib/Rails/rack/logger.rb: 16: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/request_id.rb: 22: dans `call '

rack (1.4.5) lib/rack/methodoverride.rb: 21: dans `call '

rack (1.4.5) lib/rack/runtime.rb: 17: dans `call '

actifsupport (3.2.13) lib/actif_support/cache/strategie/local_cache.rb: 72: dans `call '

rack (1.4.5) lib/rack/lock.rb: 15: dans `call '

actionpack (3.2.13) lib/action_dispatch/middleware/static.rb: 63: dans `call '

rails (3.2.13) lib/Rails/engine.rb: 479: dans `call '

rails (3.2.13) lib/Rails/application.rb: 223: dans `call '

rails (3.2.13) lib/Rails/railtie/configurable.rb: 30: dans `method_missing '

passagers (4.0.2) lib/phusion_passenger/rack/thread_handler_extension.rb: 77: dans `process_request '

passagers (4.0.2) lib/phusion_passenger/request_handler/thread_handler.rb: 135: dans `accept_and_process_next_request '

passagers (4.0.2) lib/phusion_passenger/request_handler/thread_handler.rb: 106: dans `main_loop '

passagers (4.0.2) lib/phusion_passenger/request_handler.rb: 449: en `bloc (4 niveaux) dans start_threads '

passagers (4.0.2) lib/phusion_passenger/utils/robust_interruption.rb: 108: dans `disable_interruptions '

passagers (4.0.2) lib/phusion_passenger/request_handler.rb: 444: dans le bloc `(3 niveaux) dans start_threads '

Edit: Ceci est le texte de l'exécution de Devise.helpers dans la console.

$ Rails console

Chargement de l'environnement de développement (Rails 3.2.13)

1.9.3-p429: 001> Devise.helpers

=> # <Set: {Devise :: Controllers :: Helpers}>

Edit: Ceci est mon fichier route 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

Assurez-vous d'ajouter devise_for :user dans votre routes.rb 

Voir plus ici: https://stackoverflow.com/a/11180576

32
paulguy

Redémarrez simplement votre serveur Rails.

"Notez que vous devez redémarrer votre application ici si vous l'avez déjà démarrée . Sinon, vous rencontrerez d'étranges erreurs, telles que des utilisateurs incapables de se connecter et des aides de routage indéfinies." [Instructions de mise en route]

[edit] Réponse plus détaillée:

Veuillez vérifier deux choses supplémentaires: Votre HomeController doit hériter de Devise :: Controllers :: Helpers. Et la directive de calcul dans route.rb (qui génère la méthode manquante dans Helpers) devrait avoir étendu Devise. @@ mappings. Le code suivant peut vérifier ceci:

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

Pour introduire un problème similaire dans une application Rails en fonctionnement, les entrées config/initializers/invent.rb et config/routes.rb doivent être désactivées et Rails doit être redémarré. La réactivation du code ne résoudra pas le problème à moins que Rails ne soit redémarré.

6
kunysch

Il y a beaucoup de choses qui peuvent aller mal. Quelques points à vérifier dans l'ordre:

  • Ne pas être en mesure d'appeler before_filter :authenticate_user! indique que le périphérique n'est pas configuré correctement. 
  • Ajoutez devise_for :users dans routes.rb (il s’agit de l’utilisateur s , vous avez ce droit), puis simplifiez les règles de portée pour les tests.
  • Le before_filter :authenticate_user! doit fonctionner pour que les assistants se trouvent dans le contrôleur ou les inclure manuellement.
  • Si votre contrôleur de base n'hérite pas d'ActionController, vous devez ajouter les méthodes d'assistance manuellement: Mettez ceci dans votre contrôleur de base helper_method "current_user", "user_signed_in?", "user_session"
  • Une chose à vérifier: Est-ce que self.controller.current_user fonctionne dans votre erb? Cela indiquerait que les méthodes helper_ ne sont pas incluses.
2
Christopher Oezbek

J'ai ajouté cette ligne à mon contrôleur qui a fait le tour pour moi:

include Devise::Controllers::Helpers
1
AmitF

J'ai eu le même problème en suivant le guide de démarrage de Devise.

Il s’est avéré que j’avais exécuté par erreur Rails generate model User plutôt que Rails generate devise User, ce qui venait de créer un modèle ActiveRecord en clair portant le nom «User».

0
Niek

J'ai eu le même problème (Rails 5.1.2, Devise 4.3.0) et il se trouve que j'utilisais: -

devise_for :user do
  ...
end

au lieu de

devise_for :users do
  ...
end

Je l'ai corrigé en changeant l'espace de noms.

utilisateur => utilisateurs

0
Roshan