2016-06-15 4 views
1

в моем маршруте show, есть маршрут my_search (в основном show#my_search), который показывает массив хэшей данных в HTML.Rails export array hash to csv

Что мне нужно сделать, это просто сбросить @data в мой render (или частично) и обработать их в представлениях, сделав его таблицей HTML со встроенным рубином.

Однако есть ли простой способ отправить тот же @data в CSV-файл? Должен ли я снова получить @data и сделать другой маршрут специально для него? Это способ получить доступ к @data (желательно, по ссылке для загрузки CSV или json render) при показе страницы localhost://show/my_search?

Edit:

@data выглядит следующим образом:

@data = [ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ]

app/controllers/show_controller.rb выглядит следующим образом:

def my_search 
    @data = [ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ] # and other rows 
    # and do other stuff here 

    render "table_template" 

в app/views/show/table_template.html выглядит следующим образом:

<table> 
    <thead> 
    <tr> 
    <th>Name</th> 
    <th>Age</th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @data.each do |row| %> 
     <tr> 
     <td><%= row['name'] %></td> 
     <td><%= row['age'] %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

Обновление 6/20/2016: мой текущий workround:

app/controllers/show_controller.rb:

def my_search 
    get_data 
    # and do other stuff here 

    render "table_template" 
end 

def my_search_export 
    get_data 
    format.each do |format| 
    # something that renders the CSV format when visiting localhost://my_search_export.csv 
     ..... 
    end 
end 




private 
def get_data # writes to @data 
    @data=[ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ] 
end 

в виду: добавить URL в localhost://my_search_export.csv.

Плохая вещь, она загружает данные снова, хорошо, что рабочий процесс прост. Я все еще ищу лучшее решение.

P.s. этот веб-сайт может работать одновременно с другим пользователем, поэтому сохранение глобальной переменной не подходит для меня.

+0

Возможный дубликат [Выходной массив в CSV в Ruby] (http://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby) – Seth

+0

Спасибо Сет, но как я вывожу CSV загружаемый ссылка при показе веб-страницы 'localhost: // show/my_search' –

+0

http://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv-file может помочь - - но это только позволит перейти к 'localhosts: // some/path/file.csv', что означает, что он не показывает веб-страницы в' localhosts: // some/path/file.csv' –

ответ

0

Обновление 6/20/2016: мой текущий workround:

приложение/контроллеры/show_controller.rb:

Защиту my_search get_data # и делать другие вещи здесь

render "table_template" 

конец

def my_search_export get_data формат. каждый делает | формат | # что-то, что отображает формат CSV при посещении localhost: //my_search_export.csv ..... конца конца

частного Защиту get_data # пишет @data @ данные = [{ "имя" => "Джон", "возраст" => "21"}, { "имя" => "Amy "," age "=>" 20 "}] end in view: добавить URL-адрес в localhost: //my_search_export.csv.

Плохая вещь, она загружает данные снова, хорошо, что рабочий процесс прост. Я все еще ищу лучшее решение.

P.s. этот веб-сайт может работать одновременно с другим пользователем, поэтому сохранение глобальной переменной не подходит для меня.

2

Вы можете открыть CSV и написать к нему, прежде чем ваш render, если вы хотите:

@data = { first_stuff: ['a', 'b', 'c'], second_stuff: [1, 2, 3] } 
CSV.open('some/file.csv', 'w') do |csv| 
    @data.each_pair do |key, value| 
    csv << value 
    end 
end 
render json: @data 

... и так далее. Трудно получить более конкретную информацию, не зная, как выглядит ваш @data, но я надеюсь, что это поможет!

+0

Спасибо за помощь! Я добавляю больше описания к вопросу. Разве что, если эта функция имеет «render json: @ data», то она не будет отображать какую-либо страницу html? Это способ доступа к '@ data' при показе страницы' localhost: // show/my_search'? –

+0

О, вы хотите написать CSV-файл (и, возможно, добавить ссылку на путь этого 'some/file.csv 'в представлении) к локальному пути (может быть, в' public'??), Прежде чем вынести веб-страницу? –

+0

О, если вы просматриваете HTML-страницу, переменные экземпляра вашего контроллера должны просто быть доступны в представлении. Другими словами, просто отредактируйте страницу, и '@ data' должен использоваться в шаблоне. Что касается вашего второго комментария, вы можете установить путь файла CSV к переменной экземпляра (т. Е. '@csv_path = 'some/file.csv''), а затем она также будет доступна в вашем представлении для целей связывания. – jmschles