定义了方法的控制器中的 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.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)
所以控制器 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 并因此收到错误。
我完成了控制器的实现和测试,然后在 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.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)
所以控制器 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 并因此收到错误。