【问题标题】:rails 3: format.csv gives "no template error" but format.json needs no templaterails 3:format.csv 给出“无模板错误”,但 format.json 不需要模板
【发布时间】:2011-08-16 04:29:36
【问题描述】:

为什么在没有模板的情况下渲染 :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" }

【问题讨论】:

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


【解决方案1】:

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 方法,或者让上面的块检测和处理数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2013-03-21
    • 2021-12-05
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多