【问题标题】:Rails 4 export as csv: undefined method `attributes'Rails 4 导出为 csv:未定义的方法“属性”
【发布时间】:2016-03-07 10:36:14
【问题描述】:

我正在尝试将数据导出到 csv 文件。我的代码这个

@products = Product.all

    respond_to do |format|
      format.csv { render text: @products.to_csv }
    end

在我的模型中

def self.to_csv(options = {})
    CSV.generate(options) do |csv|
      csv << column_names
      all.each do |product|
        csv << self.attributes.values_at(*column_names)
      end
    end
  end

这不起作用。我收到此错误

NoMethodError in ProductsController#index
undefined method `attributes' for #<Class:0x000000047e91c8>

我在 Rails 4 和 ruby​​ 2.2 中。我该如何解决这个问题?

【问题讨论】:

  • 试试product.attributes.values_at(*column_names) 而不是self.attributes.values_at(*column_names)

标签: ruby-on-rails csv


【解决方案1】:

ProductsController#index 未定义方法中的 NoMethodError 类的“属性”:0x000000047e91c8

正如我所说,您应该使用product.attributes.values_at(*column_names) 而不是self.attributes.values_at(*column_names)

def self.to_csv(options = {})
    CSV.generate(options) do |csv|
      csv << column_names
      all.each do |product|
        csv << product.attributes.values_at(*column_names)
      end
    end
 end

Source

【讨论】:

  • 它工作得很好,但为什么它不能与 self.attributes 一起工作......当项目在 rails 3 中时它曾经工作过
【解决方案2】:

您在模型的类方法 (def self.to_csv) 中。在此方法中self 是类Product,而不是产品实例。但是您想访问产品实例的属性。您遍历 all 产品对象。因此,您需要访问当前产品对象,该对象在每次迭代时都会提供给您 (|product|)。所以试试product.attributes而不是self.attributes

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-05-05
    相关资源
    最近更新 更多