Подтвердить что ты не робот

Указать помощников (authenticate_user!, current_user, user_signed_in?) Не инициализировано

Я настраиваю устройство и должен иметь возможность использовать помощников-помощников. Когда я добавляю 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, который его вызывает. То же самое происходит для любого из помощников. Похоже, что они не загружаются вообще, однако, когда я загрузил консоль рельсов и ввел $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" 

Так кажется, что они действительно должны быть загружены рельсами.

Это мой контроллер приложений

class ApplicationController < ActionController:: Base

helper: все # включают всех помощников, все время
  protect_from_forgery
  включить ActionView:: Helpers:: NumberHelper
  before_filter: authenticate_user!

конец

Я перезапустил сервер после установки devise, и несколько раз, когда я пробовал разные попытки решить проблему. Если требуется больше файлов или информации, пожалуйста, дайте мне знать. Заранее большое спасибо.

Изменить: файл user.rb был запрошен, чтобы показать, что я действительно установил программу

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

Изменить: полное сообщение об ошибке

NoMethodError в индексе HomeController #

undefined метод `authenticate_user! ' для # < HomeController: 0x000000040c45a0 > '

Вот полная трассировка

activesupport (3.2.13) lib/active_support/callbacks.rb: 418: в `run_2094683035699451847__process_action_2229546931289158113_callbacks '

activesupport (3.2.13) lib/active_support/callbacks.rb: 405: в `__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: в `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: в `block in process_action '

activesupport (3.2.13) lib/active_support/notifications.rb: 123: в блоке в инструменте

activesupport (3.2.13) lib/active_support/notifications/instrumenter.rb: 20: в инструменте

activesupport (3.2.13) lib/active_support/notifications.rb: 123: в инструменте

actionpack (3.2.13) lib/action_controller/metal/instrumentation.rb: 29: в `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: в `process '

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

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

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

actionpack (3.2.13) lib/action_controller/metal.rb: 246: в блоке в действии

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

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

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

путешествие (1.0.4) lib/travel/router.rb: 68: в блоке в вызове

путешествие (1.0.4) lib/travel/router.rb: 56: в `each '

путешествие (1.0.4) lib/travel/router.rb: 56: в `call '

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

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

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

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

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

стойка (1.4.5) lib/rack/etag.rb: 23: в `call '

стойка (1.4.5) lib/rack/conditionalget.rb: 25: в `call '

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

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

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

rack (1.4.5) lib/rack/session/abstract/id.rb: 210: в контексте

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

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

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

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

actionpack (3.2.13) lib/action_dispatch/middleware/callbacks.rb: 28: в блоке в вызове

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: в `__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: в `run_callbacks '

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

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

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

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

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

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

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

activesupport (3.2.13) lib/active_support/tagged_logging.rb: 22: в теге

railties (3.2.13) lib/rails/rack/logger.rb: 16: в `call '

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

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

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

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

стойка (1.4.5) lib/rack/lock.rb: 15: в `call '

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

railties (3.2.13) lib/rails/engine.rb: 479: в `call '

railties (3.2.13) lib/rails/application.rb: 223: в `call '

railties (3.2.13) lib/rails/railtie/configurable.rb: 30: в `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: в `accept_and_process_next_request '

пассажир (4.0.2) lib/phusion_passenger/request_handler/thread_handler.rb: 106: в `main_loop '

пассажир (4.0.2) lib/phusion_passenger/request_handler.rb: 449: в блоке (4 уровня) в start_threads

пассажир (4.0.2) lib/phusion_passenger/utils/robust_interruption.rb: 108: в `disable_interruptions '

пассажир (4.0.2) lib/phusion_passenger/request_handler.rb: 444: в блоке (3 уровня) в start_threads '

Изменить: это текст запускает Devise.helpers в консоли.

$rails console

Загрузка среды разработки (Rails 3.2.13)

1.9.3-p429: 001 > Devise.helpers

= > # < Set: {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 
4b9b3361

Ответ 2

Просто перезагрузите сервер рельсов.

"Обратите внимание, что вы должны заново запустить свое приложение здесь, если вы его уже запустили. В противном случае вы столкнетесь с такими странными ошибками, как пользователи, которые не могут войти в систему, а помощники маршрута - undefined. "[Инструкции по началу работы]

[edit] Более подробный ответ:

Проверьте две дополнительные вещи: ваш HomeController должен наследовать от Devise:: Controllers:: Helpers. А директива devise в файле route.rb(которая генерирует недостающий метод в Helpers) должна иметь расширенные Devise. @@сопоставления. Следующий код может проверить это:

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

Чтобы ввести аналогичную проблему в приложении рабочих рельсов, необходимо отключить конфигурационные/инициализаторы/devise.rb и элементы конфигурации config/routes.rb, а рельсы необходимо перезапустить. Повторное использование кода не устранит проблему, если рельсы не будут перезапущены.

Ответ 3

Есть много вещей, которые могут пойти не так. Некоторые вещи для проверки в порядке:

  • Невозможность вызова before_filter :authenticate_user! означает, что устройство настроено неправильно.
  • Добавьте devise_for :users в routes.rb(его пользователь s, вы получили это право), затем упростите эти правила для тестирования.
  • Вам нужно, чтобы before_filter :authenticate_user! работал, чтобы получить помощников в контроллере или вручную включить помощники
  • Если ваш базовый контроллер не наследуется от ActionController, вам необходимо вручную добавить вспомогательные методы: поместите это в свой базовый контроллер helper_method "current_user", "user_signed_in?", "user_session"
  • Одна вещь, чтобы проверить: работает ли self.controller.current_user в вашем erb? Это означало бы, что helper_methods не включаются.

Ответ 4

Я добавил эту строку к моему контроллеру, который помогло:

include Devise::Controllers::Helpers

Ответ 5

У меня была та же проблема (Rails 5.1.2, Devise 4.3.0), и оказалось, что я использовал: -

devise_for :user do
  ...
end

вместо

devise_for :users do
  ...
end

Я исправил это, изменив пространство имен.

user = > users

Ответ 6

У меня была такая же проблема после руководства по началу работы с Devise.

Оказывается, я ошибочно запускал rails generate model User, а не rails generate devise User, который только что создал обычную модель ActiveRecord, у которой было имя "Пользователь".