【发布时间】:2019-04-18 23:03:00
【问题描述】:
我完成了一个控制器的实现和测试,然后在 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 方法。
我在文件config/environments/development.rb 中添加了PaypalAccessToken.update() - 这有效。
现在我已经在应用程序的其他看似无关的部分中实现了一些东西,我不能再从这个控制器调用方法了。
我从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 一样,正确地将这些方法声明为类方法.
感谢回复
【问题讨论】:
-
出于好奇,直接调用控制器类方法的用例是什么?
-
控制器处理包含 paypal api 令牌的模型。它应该只是在令牌过期后刷新,我为此创建了一个循环作业,它调用了更新方法。
-
嗨 Eirik,
Added an edit and solution at the end of the post.请不要那样做。添加自己的答案并从问题中删除您的(答案)编辑。 -
这听起来像是服务对象的完美用例。我不知道你为什么要使用控制器。控制器用于处理请求-响应周期。但是,不管你的船是什么。
标签: ruby-on-rails nomethoderror actioncontroller