2016-03-07 2 views
0

Я пытаюсь экспортировать данные в файл csv. Мой код этогоRails 4 export as csv: undefined method `attributes '

@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. Как я могу это исправить?

+2

Попробуйте 'product.attributes.values_at (* column_names)' вместо 'self.attributes.values_at (* column_names)' – Pavan

ответ

1

NoMethodError в ProductsController # индекс не определен метод `атрибуты для класса: 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

+0

хорошо работает, но почему это не работает с self.attributes .... Оно использовалось для работа, когда проект был в рельсах 3 – asdfkjasdfjk

0

Вы находитесь в методе класса (def self.to_csv) вашей модели. В рамках этого метода self является классом Product не экземпляром продукта. Но вы хотите получить доступ к атрибутам экземпляра продукта. Вы проследуете через объекты all. Поэтому вам нужно получить доступ к текущему объекту продукта, который предоставляется вам (|product|) для каждой итерации. Попробуйте product.attributes вместо self.attributes.