ruby-on-rails 未初始化设计帮助程序(authenticate_user!,current_user,user_signed_in?)

ztmd8pv5  于 2022-11-19  发布在  Ruby
关注(0)|答案(7)|浏览(177)

我正在设置device,需要能够使用device助手。当我将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控制台并输入$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"

因此,看来它们确实应该由铁轨装载。
这是我的应用程序控制器
应用控制器〈操作控制器::Base
helper:all #始终包含所有助手
防止伪造
包括操作视图::帮助程序::数字帮助程序
过滤之前:验证用户!
结束
我重新启动服务器后,安装设计,并多次尝试不同的尝试来解决问题.如果任何更多的文件或信息是需要的,请让我知道.非常感谢您提前.
编辑:我的用户.rb文件被要求显示我确实安装了device

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#索引中出现NoMethodError
未定义#的'authenticate_user!'< HomeController:0x000000040c45a0 >方法
这是完整的轨迹
调用的方法是:调用一个或多个回调函数,然后调用一个或多个回调函数。
调用调用函数库中的调用函数。
调用的方法是:调用一个新的过程,然后调用另一个新的过程。
在运行回调函数中,调用的类型为:
在“进程_操作”中,调用一个或多个抽象控制器。
在“过程_动作”中,可以使用以下命令:
操作控制器/金属/仪器.rb:30:in '过程操作中的块'
123:在'仪器中的块'中
活动支持(3.2.13)库/活动支持/通知/仪器输入.rb:20:在'仪器'中
123:在“仪器”中
在“过程_动作”中,可以使用以下命令:
在“进程_操作”中,可以使用以下命令:
121:在“进程”中
在“进程”中使用
203:在“调度”中
在“调度”中,使用“操作控制器/金属/机架委派”。
在“操作中的块”中
在调用过程中,调用者可以调用一个或多个路由。
操作包(3.2.13)/操作调度/路由/路由设置.rb:73:在'调度'中
在调用过程中,调用者可以调用一个或多个路由器,然后调用路由器。
journey(1.0.4)/journey/路由器.rb:68:in '调用中的块'
journey(1.0.4)库/journey/路由器.rb:56:在'每个'中
/journey/路由器.rb:56:在'调用'中
612:在“调用”中,调用者可以调用一个或多个路由。
管理员(1.2.1)lib/管理员/管理员.rb:35:in '阻塞呼叫'
监狱长(1.2.1)监狱长/监狱长/管理员。
管理员(1.2.1)lib/管理员/经理.rb:34:在'调用'中
在调用过程中,调用者可以调用中间件,然后调用中间件。
在“调用”中,请输入“
在“调用”中,调用者可以调用一个或多个参数。
在调用过程中,调用者可以调用中间件来调用中间件。
在调用过程中,调用者可以调用中间件,然后调用中间件。
在调用过程中,调用者可以调用中间件来调用中间件。
在“上下文”中
在“调用”中,请输入以下命令:
在调用中调用中间件的方法
在调用过程中,调用者可以调用一个或多个记录。
连接适配器/抽象/连接池.rb:479:在'调用'中
调用中的块
调用时,调用者必须先调用该函数,然后才能调用该函数。
调用调用函数库中的调用函数。
调用回调函数时,调用调用回调函数时,调用调用回调函数。
在运行回调函数中,调用的类型为:
调用调用调用调用调用调用调用
在调用过程中,调用者可以调用中间件来调用中间件。
在调用过程中,调用者可以通过调用中间件来调用远程IP。
调试异常.rb:16:在'调用'中

在调用过程中,调用者可以通过调用中间件来调用中间件。
在'call_app'中,可以使用以下命令:
railties(3.2.13)lib/rails/rack/logger.rb:16:in '调用中的块'
活动支持(3.2.13)库/活动支持/标记日志.rb:22:在“标记”中
轨道(3.2.13)lib/轨道/机架/记录器.rb:16:in 'call'
在调用过程中,调用者可以调用中间件来调用中间件。
在“调用”中,调用者可以调用一个或多个函数。
1.4.5)文件库/文件架/运行时间.rb:17:在'调用'中
动态支持(3.2.13)库/动态支持/缓存/策略/本地缓存.rb:72:在'调用'中
1.4.5)库/架/锁.rb:15:在'调用'中
在调用过程中,调用者可以调用中间件来调用中间件。
第一部分:第一部分:第二部分:第一部分:第二部分:第三部分:第四部分:第五部分:第四部分:第五部分:第六部分:第六部分:第七部分:第六部分:第七部分:第七部分:第八部分:第七部分:第八部分:第七部分:第八部分:第九部分:第七部分:第八部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分:第九部分
在“调用”中,调用者可以使用以下命令:
在'方法缺失'中,rb:30:
线程处理程序扩展.rb:77:在'进程请求'中
135:在“接受和处理下一个请求”中
106:在'主循环'中
449:在“启动线程中的块(4层)”中
乘客(4.0.2)库/phusion_乘客/实用程序/健壮_中断.rb:108:在'禁用_中断'中
444:在“启动线程中的块(3层)”中
编辑:这是在控制台中运行Devise.helpers的文本。
$ rails控制台
加载开发环境(Rails 3.2.13)
1.9.3-p429:001〉设计助手
=〉#〈设置:{设备::控制器::助手}〉
编辑:这是我的路由rb文件。

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
xxe27gdn

xxe27gdn1#

请确保在routes.rb中添加devise_for :user
更多信息,请访问:https://stackoverflow.com/a/11180576

c9x0cxw0

c9x0cxw02#

只需重新启动您的Rails服务器。
“请注意,如果您已启动应用程序,则应在此处重新启动。否则,您将遇到奇怪的错误,如用户无法登录和未定义路径帮助程序。”[Getting Started Instructions]
[编辑]更详细的答案:
请确认另外两件事:您的HomeController应该继承自Devise::Controllers::Helpers。route.rb中的devise指令(在Helpers中生成缺少的方法)应该扩展Devise.@@Map。以下代码可以对此进行检查:

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/devies.rb和config/routes.rb devies条目,并重新启动rails。重新启用代码并不能解决问题,除非重新启动rails。

chhqkbe1

chhqkbe13#

有很多事情都可能出错。有些事情需要按顺序检查:

  • 无法调用before_filter :authenticate_user!表示设备设置不正确。
  • 在routes.rb中添加devise_for :users(它是users,您没有弄错),然后简化这些用于测试的作用域规则。
  • 您需要让before_filter :authenticate_user!工作,以在控制器中获取帮助程序或手动包含帮助程序
  • 如果您的基本控制器没有继承自ActionController,则需要手动添加helper方法:把这个放进你的基本控制器helper_method "current_user", "user_signed_in?", "user_session"
  • 有一件事要检查:self.controller.current_user在您的erb中工作吗?这表明helper_methods没有被包含。
z2acfund

z2acfund4#

我在我的控制器中添加了这一行代码,它对我起了作用:

include Devise::Controllers::Helpers
w8rqjzmb

w8rqjzmb5#

我遇到了同样的问题(Rails 5.1.2,Devise 4.3.0),碰巧我使用的是:-

devise_for :user do
  ...
end

代替

devise_for :users do
  ...
end

我通过更改名称空间修复了它。
用户=〉用户

67up9zun

67up9zun6#

我在阅读Devise的入门指南时也遇到了同样的问题。
结果我错误地运行了rails generate model User,而不是rails generate devise User,它只是创建了一个名为“User”的普通ActiveRecord模型。

cwtwac6a

cwtwac6a7#

我最愚蠢的问题是

before_action authenticate_user!
  # Instead of
  before_action :authenticate_user! # Note the colon

相关问题