控制器中的NoMethodError已定义方法

问题描述 投票:0回答:3

我完成了对控制器的实现和测试,然后在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所指出的那样,正确地将方法声明为类方法。

谢谢你的回复

ruby-on-rails nomethoderror actioncontroller
3个回答
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

0
投票

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


0
投票

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

PaypalAccessTokenController.new.update

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

bundle exec rake routes

这将告诉你究竟哪条路线指向哪个controller#action,并且应该给你一些关于问题是什么的指针。在这里粘贴相关路线是你无法搞清楚的。还要注意HTTP方法(GET / POST / PATCH)。您可能正在使用GET而不是PATCH并因此得到错误。

© www.soinside.com 2019 - 2024. All rights reserved.