Создание CSV-файла из rails

Я читал подобные вопросы, но многие ответы устарели или недостаточно ясны для меня.

Я хотел бы иметь возможность просто сделать что-то вроде (в действии контроллера):

respond_to do |format|
  format.html
  format.csv
end

Я знаю, что тогда мне нужно посмотреть как действие.csv.Эрб


Итак, мои вопросы:

1) Что мне нужно настроить в rails, чтобы это произошло в целом.

2) Как настроить представление CSV для отображения некоторых основных поля из модели?

обновление:

Итак, я попытался пройти маршрут запятой, я установил и продал драгоценный камень.

затем, согласно read me, Я бросил это в свою модель (настроенную на мои потребности):

comma do

user_id 'User'
created_at 'Date'
name 'Name'
end

затем я бросил это в элемент управления для действия индекса (согласно readme):

  format.csv { render :csv => MyModel.limited(50) }

затем при доступе к индексу (не в формате CSV), я получаю следующее исключение ActionController ошибка:

неопределенный метод `запятая' для

Итак, я погуглил это, и я прочитал, что я должен поставить "запятую" в моей модели.

после этого я обновил (мою страницу индекса), и ошибка меняется на:

нет такого файла для загрузки -- comma

поэтому в этот момент я решил, что это не должно быть найти файлы запятых, очевидно. Поэтому я скопировал файлы из проданы папка gem запятой, из папки lib запятой, в папку Rails lib. Затем я обновил страницу и приземлился на эту ошибку:

неинициализированная постоянная ошибка

тогда я в значительной степени сдался.

ошибки трассировки были:

/пользователи/Эллиот/.gem / ruby / 1.8/gems/activesupport-2.3.5/lib/active_support / зависимости.rb: 443: in load_missing_constant' /Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:80:in const_missing' /Пользователи/Эллиот/.gem / ruby / 1.8/gems/activesupport-2.3.5/lib/active_support / зависимости.rb: 92: in `const_missing'

Другие заметки, я уже установил FasterCSV

надеюсь, что этого достаточно:)

4 ответов


Я предлагаю взглянуть на запятая. Он работает очень хорошо и позволяет обрабатывать материал на уровне модели, в отличие от уровня представления.


посмотрите на FasterCSV.

csv_string = FasterCSV.generate do |csv|

  cols = ["column one", "column two", "column three"]

  csv << cols

  @entries.each do |entry|                
    csv << [entry.column_one, entry.column_two, entry.column_three ]
  end

  filename = "data-#{Time.now.to_date.to_s}.csv"    

end

send_data(csv_string, :type => 'text/csv; charset=utf-8; header=present', :filename => filename)  

Это ужасно, но библиотека CSV (в 1.9, = = FasterCSV) не будет хорошо играть с meta_where, поэтому я сделал это так:

@customers.collect {|c| lines.push ["#{c.lastname}","#{c.firstname}","#{c.id}","#{c.type}"}
lines = lines.collect {|line| line.join(',')}
csv_string = lines.join("\n")  
respond_to do |format|
  format.html
  format.csv { send_data(csv_string, :filename => "#{@plan.name.camelize}.csv", :type => "text/csv") }
end

Это некрасиво, но эффективно.


взгляните на CSV Shaper.

https://github.com/paulspringett/csv_shaper

Он имеет хороший DSL и очень хорошо работает с моделями Rails.