Rails: Експортирането в CSV е неуспешно

Опитвам се да експортирам данните си в 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?


person user1385816    schedule 02.09.2015    source източник
comment
Опитайте да добавите :format => :csv към вашия link_to   -  person Nathan    schedule 02.09.2015


Отговори (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
person Rokibul Hasan    schedule 02.09.2015
comment
Вашето предложение изглежда го подобрява, но след това получих грешка като тази: NoMethodError (undefined method 'to_csv' for #<String:0x0000000a57c1c8>): Мисля, че може нещо да не е наред с моя модел - person user1385816; 02.09.2015
comment
Не намерих никакъв метод като to_csv във вашия код, можете да проследите подробности от регистрационния файл. Но мисля, че няма нужда да използвате as_csv, извикано във вашето действие на контролера, можете да получите csv само с помощта на send_data @output, защото @output вече съдържа csv данни за вас. - person Rokibul Hasan; 02.09.2015
comment
А, да, промених as_csv в to_csv, за да видя дали това работи. Но приех предложението ви само за да го премахна и се получи, благодаря! - person user1385816; 02.09.2015
comment
Добре дошъл @user1385816 :) - person Rokibul Hasan; 02.09.2015

@rokibul-hasan вече отговори на въпроса, но бих ви предложил да направите една заявка, за да извлечете всички обекти:

@objects = Nterm.find(ids)

и да преминете през тези обекти, вместо да извиквате .find на всеки ID, защото удряте базата данни за всеки запис, което е ненужно. Така че нещо като:

@objects.each do |object|
  csv << [object.externalid, object.pos, ...]
end
person Adem Dinarević    schedule 19.04.2021