我完成了控制器的实现和测试,然后在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一样,将这些方法正确声明为类方法
感谢您的回复
答案 0 :(得分:0)
这可能看起来很奇怪,但是您确定已在路线上定义了正确的资源吗?
答案 1 :(得分:0)
使用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
答案 2 :(得分:0)
您不能从控制台访问类似控制器的方法,因为它们不是类方法。您可以尝试以下方法:
PaypalAccessTokenController.new.update
,但这并不意味着它会工作(可能需要params
才能工作),但是您不会得到NoMethodError
。最有可能是您弄乱了路由文件中的某些内容。您可以使用以下方法检查路线:
bundle exec rake routes
它将准确告诉您哪个路由指向哪个controller#action
,并且应该为您提供有关问题所在的一些指示。如果您无法确定相关路线,请在此处粘贴相关路线。也要注意HTTP方法(GET / POST / PATCH)。您可能使用的是GET而不是PATCH并因此得到错误。