控制器中已定义方法的NoMethodError

时间:2019-04-18 23:03:01

标签: ruby-on-rails nomethoderror actioncontroller

我完成了控制器的实现和测试,然后在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.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一样,将这些方法正确声明为类方法

感谢您的回复

3 个答案:

答案 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并因此得到错误。