用于csv的非资源的Rails路由

时间:2010-11-27 07:40:59

标签: ruby-on-rails csv routes custom-routes respond-to

我有一个名为“revisions”的方法,我希望能够使用相同的逻辑但输出到csv。我想我想使用FasterCSV宝石。我需要的是添加到我的路由中以便为html和csv输出获取路由。我希望我的网址是这样的:

invoices/51/revisions
invoices/51/revisions.csv

思想?

非常感谢!

2 个答案:

答案 0 :(得分:2)

Rails使这很容易。您根本不需要更改路径以适应CSV格式,因为rails识别csv MIME类型。

首先,在routes.rb中设置一条路线:

map.invoice_revisions 'invoices/:id/revisions.:format', 
                      :controller=>:invoices, 
                      :action=>:revisions 

在您的控制器中,执行以下操作:

def revisions
  # ... set @revisions with something like
  @revisions = Invoice.find(params[:id]).revisions

  respond_to do |format|
    format.html # will render the revisions html template
    format.csv { render :csv => revisions_csv } # see sample method below
    end
  end
end

private
  def revisions_csv # convert @revisions to csv: customize to your needs
    FasterCSV.generate do |csv|
      csv << @revisions.first.attributes.keys  # set the headers
      @revisions.each do |revision|            # set the data
        csv << revision.attributes.values
      end
    end
  end

这是一个教程,其中包含使用csvbuilder格式化csv文件的更多详细信息:

http://rubyglasses.blogspot.com/2009/07/csv-views-with-fastercsv-and-csvbuilder.html

答案 1 :(得分:0)

在您的routes.rb中:

resources :photos do
  get 'preview', :on => :member
end

http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

在您的控制器中,使用respond_to处理格式。