rails 3:format.csv给出“无模板错误”,但format.json不需要模板

时间:2011-04-30 19:11:54

标签: ruby-on-rails ruby-on-rails-3 rendering

如何渲染:json没有模板,但不渲染:csv?

在我的datapoints_controller的索引方法中:

respond_to do |format|
  format.json { render :json => @goal.datapoints.all }      
  format.csv { render :csv => @goal.datapoints.all }
end

将我的浏览器指向/datapoints.json会将该集合呈现为屏幕上的json字符串。将它指向/datapoints.csv会出错:

Template Missing: with {:locale=>[:en, :en], :formats=>[:csv],
                         :handlers=>[:rhtml, :rxml, :erb, :builder, :rjs]}

Datapoint的实例响应to_csv,但即使我手动将其映射为csv格式并将其呈现为文本,它也会产生模板缺失错误,例如,我试过这样的事情:

format.csv { render @goal.datapoints.map{|d| d.to_csv }.join "\n" }

1 个答案:

答案 0 :(得分:10)

Rails附带了一系列格式的渲染器,包括json,但不包括csv。 Here's where they are specified in the rails source(查看一系列add来电的底部)。虽然很容易创建自己的。

将这样的东西放到初始化器中(这几乎只是从上面链接的xml渲染器中复制而来,xml替换为csv):

ActionController::Renderers.add :csv do |csv, options|
  self.content_type ||= Mime::CSV
  self.response_body  = csv.respond_to?(:to_csv) ? csv.to_csv : csv
end

然后当您调用render :csv => @foo时,将调用此块,并将@foo对象作为csv参数传递。

看看你在做什么,你可能需要使用补丁Array来添加to_csv方法,或者让上面的块检测并处理数组。