2015-09-02 7 views
0

Я пытаюсь экспортировать свои данные в файл CSV. Это моя модель:Rails: Экспорт в CSV-сбой

def self.generate_csv(ids) 
    CSV.generate({:col_sep => "\t"}) do |csv| 
     csv << ['topfind terminus id','position','sequence','protein (uniprot ac)','topfind evidence ids'] 
     ids.each do |id| 
     n = Nterm.find(id)  
     csv << [n.externalid,n.pos,n.protein.sequence[n.pos-1..n.pos+9],n.protein.ac,n.evidences.collect{|e| e.externalid}.join(':')] 
     end 
    end 
    end 

И это контроллер для этой модели, которая вызывает этот метод:

def show 
    puts "id search: [#{params[:id]}]" 
    @output = Nterm.generate_csv(params[:id]) 
    respond_to do |format| 
     format.html 
     format.csv { send_data @output.as_csv } 
    end 
    p @output 
    end 

И это мое мнение:

<%= link_to "Export to CSV", {:method=> "show", :id => @nterm.map {|i| i.id }} %> 

Я не совсем конечно, что надеть мое шоу в этом случае. Как создать CSV?

+0

Попробуйте добавить ': формат =>: csv' к вашему' link_to' – Nathan

ответ

2

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

<%= link_to "Export to CSV", your_route_path(:format => :csv, :ids => @nterm.map {|i| i.id }}) %> 
изменения

И слайд необходимо ваше действие, как следующее, для приема ids

def show 
@output = Nterm.generate_csv(params[:ids]) 
#your codes goes here 
end 
+0

Ваше предложение, кажется, делает его лучше но тогда у меня возникла ошибка: 'NoMethodError (неопределенный метод 'to_csv' для # ):' Я думаю, что может быть что-то не так с моей моделью – user1385816

+1

Я не нашел никакого метода, как 'to_csv' в вашем коде вы можете отслеживать данные формы журнала. Но я думаю, что нет необходимости использовать 'as_csv', вызванный в вашем действии контроллера. Вы можете получить' csv' только с помощью 'send_data @ output', потому что' @ output' уже содержит 'csv' данные для вас. –

+0

А, да, я изменил 'as_csv' на' to_csv', чтобы убедиться, что это сработало. Но я принял ваше предложение просто удалить его, и это сработало, спасибо! – user1385816