gpt4 book ai didi

ruby-on-rails - 库类方法不被 rails 加载

转载 作者:太空宇宙 更新时间:2023-11-03 16:46:55 25 4
gpt4 key购买 nike

我有一个库,它定义了所有其他类派生自的基类。 Rails 在初始化时应该提供该库中的所有类。然而,Rails 不识别从我的库类继承的类方法。这是一个例子:

型号:应用程序/模型/mailing_address.rb:

require 'account_model'
class MailingAddress < AccountModel
# class accessors, initializer and method
end

库类:库/account_model.rb

###################################
# AccountModel
#
# This is a super class to be inherited by
# the domain classes of this application.
# Responsible for api calls and
# error handling.
##
class AccountModel
class << self
def get_all id = nil
# class method implementation
end
##
# get id
# fetch method, parses url provided by child class in path hash
# and performs appropriate fetch
# method returns class instance set by fetch
def get id
# class method implementation
end

def update_existing options
# class method implementation
end

def create_new options
#class method implementation
end

def delete_existing id
# class method implementation
end
end

这些方法使用 HTTParty gem 包装 api 调用。在加载时,方法 getget_all 被识别。但是,create_newupdate_existing 不是:

app/controllers/mailing_address_controller.rb:

def update
@mailing_address = MailingAddress.update_existing params[:mailing_address]
. . .
end

抛出以下错误:

Processing by MailingAddressesController#update as JSON
. . .
Completed 500 Internal Server Error in 133ms

NoMethodError (undefined method `update_existing' for MailingAddress:Class):
app/controllers/mailing_addresses_controller.rb:17:in `update

在Passenger中,我需要重新加载tmp/restart.txt,在WEBRick中,我需要重启服务器。

我在 IRB 中没有看到这种行为。

这是我迄今为止尝试过但没有成功的方法:

  • 在 config/initializers 中添加初始化文件
  • 在每个模型类中添加 require 语句(如示例中所示)
  • 将库类包装在模块中
  • 重命名有问题的方法(update_existing => update、foo 等)

我以前从未在 Rails 应用程序中看到过这种行为,我有另一个库类可以正常工作。

我在跑: - ruby -2.1.1 - rails 4.03 - 乘客 5.07

更新:

在尝试进一步调查时,我发现了另一个问题:

我向 MailingAddress 添加了一个类方法:

class MailingAddress < AccountModel
. . .
def self.debug_methods
return self.methods
end

这也会引发“MethodNotFound”异常。由于这确实在 rails 控制台中工作,但在 WEBRick 或 Passenger 中不起作用,我很想有一些服务器缓存正在进行。

更新

关闭一切并重新启动后,现在情况相反:

-WEBRick处理请求成功 - 乘客处理请求成功 -Rails 控制台抛出错误:

韦布里克和乘客:

Processing by MailingAddressesController#update as JSON
. . .
Completed 200 OK

控制台:

MailingAddress.update_existing params
NoMethodError: undefined method `update_existing' for MailingAddress:Class

我猜这是先到先得,谁得到加载的类。

config.autoload_paths 设置正确:

config.autoload_paths += %W(#{config.root}/lib)

最后更新似乎唯一可行的解​​决方法是破坏我的 tmp/目录并重新启动所有内容(Passenger 需要运行 touch tmp/restart.txt)。

然而,这是一个蹩脚的解决方法。我说错误!

最佳答案

您必须在类的实例上调用该方法:

MailingAddress.new.update_existing params[:mailing_address]

@mailing_address.update_existing params[:mailing_address]

如果您不需要将 update_existing 作为实例方法,您可以将其移出 self block 。

另外,您可以考虑将您的 account_model.rb 文件放在 app/models 中。这样你就不必在 mailing_address.rb 的顶部要求它

关于ruby-on-rails - 库类方法不被 rails 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com