我完成了对控制器的实现和测试,然后在Git分支之间来回切换,并在这里和那里做了一些合并等等。现在我无法使用我为控制器定义的方法,也非常困惑,因为我在试图给他们打电话时,他们会得到NoMethodError
。
在帖子的末尾添加了编辑和解决方案。
使用Rails版本5.2.3 - 这里我已经定义了我的控制器:app/controllers/paypal_access_token_controller.rb
:
class PaypalAccessTokenController < ApplicationController
before_action :authenticate_admin!, only: [:show]
def njurf
puts "#######################"
puts "why can't i call these methods dangit"
puts "#######################"
end
def show
# doesn't really matter
end
def update
# doesn't really matter either
# no syntax errors, I promise
end
end
我想在启动Rails应用程序时调用update
方法。我将PaypalAccessToken.update()
添加到文件config/environments/development.rb
- 这很有用。现在我已经在应用程序的其他看似无关的部分实现了东西,我不能再调用来自这个控制器的方法了。
我从config/environments/development.rb
中删除了这一行,这样我就可以运行Rails控制台并将njurf
方法添加到控制器中。从控制台,我试着打电话给PaypalAccessTokenController.njurf
和PaypalAccessTokenController.update
,但两个都给了我定制的NoMethodError
。
这是一些概念证明
Loading development environment (Rails 5.2.3)
irb(main):001:0> PaypalAccessTokenController.update
Traceback (most recent call last):
1: from (irb):1
NoMethodError (undefined method `update' for PaypalAccessTokenController:Class)
irb(main):002:0> PaypalAccessTokenController.update()
Traceback (most recent call last):
1: from (irb):2
NoMethodError (undefined method `update' for PaypalAccessTokenController:Class)
irb(main):003:0> PaypalAccessTokenController.njurf()
Traceback (most recent call last):
1: from (irb):3
NoMethodError (undefined method `njurf' for PaypalAccessTokenController:Class)
所以控制器类至少存在,但我不知道为什么我会收到这个错误 - 我也不知道如何修复它。
任何帮助,将不胜感激。
编辑:此控制器只有show
方法的路由。当我实现并测试update
方法时,我删除了这条路线,因为我不再需要/希望通过URL访问这些方法。这使得这些方法无法从控制台访问。
解决方案:我要么留在一个控制器方法之一的路径中 - 或者像Ricky Spanish和amit_saxena所指出的那样,正确地将方法声明为类方法。
谢谢你的回复
当您使用self
定义它时,可以调用它
def self.njurf
puts "#######################"
puts "why can't i call these methods dangit"
puts "#######################"
end
PaypalAccessTokenController.njurf
#######################
why can't i call these methods dangit
#######################
=> nil
它可能看起来很奇怪,但你确定你已经在路线上定义了适当的资源吗?
您无法从控制台访问控制器方法,因为它们不是类方法。你可以试试这个:
PaypalAccessTokenController.new.update
但这并不意味着它会起作用(它可能需要params
来工作),但你不会得到一个NoMethodError
。很可能你在路线文件中弄乱了一些东西。您可以使用以下方式检查路线:
bundle exec rake routes
这将告诉你究竟哪条路线指向哪个controller#action
,并且应该给你一些关于问题是什么的指针。在这里粘贴相关路线是你无法搞清楚的。还要注意HTTP方法(GET / POST / PATCH)。您可能正在使用GET而不是PATCH并因此得到错误。