定义了方法的控制器中的 NoMethodError

NoMethodError in controller that has methods defined

我完成了控制器的实现和测试,然后在 Git 个分支之间来回切换,并在这里和那里进行了一些合并,等等。 现在我无法使用我为控制器定义的方法,而且也很困惑,因为我在尝试调用它们时得到 NoMethodError

在 post 的末尾添加了一个编辑和解决方案。


使用 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.njurfPaypalAccessTokenController.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)

所以控制器 class 至少存在,但我不知道为什么会出现此错误 - 我也不知道如何修复它。

如有任何帮助,我们将不胜感激。

编辑: 这个控制器只有 show 方法的路由。我在实现和测试 update 方法后删除了这条路由,因为我不再 needed/wanted 这些方法可以通过 URL 访问。 这就是无法从控制台访问这些方法的原因。


解决方案:要么我离开一个控制器的方法 - ,就像 Ricky Spanish 和 amit_saxena 下面指出,正确地将方法声明为 class 方法。

感谢回复

它可能看起来很奇怪,但你确定你已经在路由上定义了正确的资源吗?

你可以调用它,当你用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

您无法从控制台访问控制器方法,因为它们不是 class 方法。您可以试试这个:

PaypalAccessTokenController.new.update

但这并不意味着它会起作用(它可能需要 params 才能起作用),但您不会得到 NoMethodError。很可能你在你的路由文件中弄乱了一些东西。您可以使用以下方式检查路线:

bundle exec rake routes

它会准确地告诉你哪条路线指向哪条 controller#action 并且应该给你一些关于问题所在的指示。把相关的路线贴在这里是你想不通的。还要注意 HTTP 方法 (GET/POST/PATCH)。您可能正在使用 GET 而不是 PATCH 并因此收到错误。