【问题标题】:NoMethodError in controller that has methods defined已定义方法的控制器中的 NoMethodError
【发布时间】: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.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)

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

任何帮助将不胜感激。

编辑:这个控制器只有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


【解决方案1】:

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

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

    【讨论】:

    • 我有一条通往 show 方法的路线用于测试目的,而没有其他路线通往该控制器。删除该路线似乎导致了问题。对我来说还是有点奇怪,删除到 show 的路由会使 Rails 控制台无法访问 update
    • 你可以只添加:参数到你的路由并在那里添加显示和更新,否则,你应该为你想要使用的每个函数指定路由。
    【解决方案3】:

    您不能从控制台访问这样的控制器方法,因为它们不是类方法。你可以试试这个:

    PaypalAccessTokenController.new.update

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

    bundle exec rake routes

    它将准确地告诉您哪条路线指向哪个controller#action,并且应该为您提供一些关于问题所在的指示。在此处粘贴相关路线是您无法弄清楚的。还要注意 HTTP 方法(GET/POST/PATCH)。您可能正在使用 GET 而不是 PATCH 并因此得到错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多