【问题标题】:Difficulty calling a class method in rails. Have other class methods that work fine在 Rails 中调用类方法很困难。有其他可以正常工作的类方法
【发布时间】:2020-09-02 19:34:42
【问题描述】:

所以我正在尝试编写一个类方法来使用邮件程序类发送 csv 文件。我想我已经把这个逻辑全部解决了,我遇到的问题是 NoMethodError。我已经在我的 Order 类中定义了方法(见下文):

class Order < ApplicationRecord

def self.to_csv
    attributes = %w{ id customer_name, customer_email, street_address, city, state, zip_code, number_books }
    orders = Order.where(Date.today.all_day)

    CSV.generate(headers: true) do |csv|
      csv << attributes

      orders.each do |order|
        csv << attributes.map { |attr| order.send(attr) }
      end
    end
  end
end

我只是想在控制台中调用这个方法,看看它给了我什么样的输出。

我收到以下错误:

NoMethodError: undefined method `to_csv' for #<Class:0x00007fb7ef8a7560>
Did you mean?  to_s
from /Users/mymac/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

我还尝试编写任何简单的类方法,例如在控制台打印一个单词,但我得到了同样的错误。我已经重新启动了我的 Rails 服务器,但我认为我什至不必这样做??

感谢任何帮助。对于我已经做了一百万次而没有问题的事情遇到问题是非常令人沮丧的。

【问题讨论】:

  • self.method 内的 class 不能在类的实例上调用,它们是类方法。我假设你已经初始化了一个 Order 的实例删除 self 并且你应该能够调用该方法。
  • 我在终端中调用此方法,如下所示:“Order.to_csv”。我也遇到了与实例方法相同的错误。我只是尝试创建一个实例方法并在 Order (Order.first) 的单个实例上调用它并得到相同的错误。
  • 我正在重新启动我的控制台,这也没有帮助。
  • 在 Rails 中,自动加载器应该处理这样的事情,但如果它弄糊涂了,Spring 预加载器可能有问题,所以spring stop 可以帮助重置它。
  • 总是禁用弹簧。春天永远不值得。

标签: ruby class-method nomethoderror


【解决方案1】:

Rails 通常会在 app/config/routes.rb 更改时重新加载它们,但在某些情况下,类无法正确重新加载并且旧版本的缓存版本被卡住。这通常是由Spring 引起的,它试图保持最新但有时可能会不同步。

通常的解决方法是:

spring stop

如果它给您带来很多麻烦,您也可以禁用它。 Rails 启动时间可能会慢一些,但对您来说可能不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多