更多动态路线?

时间:2011-10-17 18:22:11

标签: ruby-on-rails routes

我有这个网站,我希望能够使用CSV导出所有数据。有一个名为“dataexport”的控制器,它有一个每个模型的方法。在我的routes.rb文件中,我有这个:

match "export_checkouts", :to => "dataexport/checkouts_csv"
match "export_committees", :to => "dataexport/committees_csv"
match "export_libitems", :to => "dataexport/libitems_csv"  
match "export_locations", :to => "dataexport/locations_csv"
match "export_logs", :to => "dataexport/logs_csv"
match "export_patrons", :to => "dataexport/patrons_csv"
match "export_products", :to => "dataexport/products_csv"
match "export_questions", :to => "dataexport/questions_csv"
match "export_reasons", :to => "dataexport/reasons_csv"
match "export_roles", :to => "dataexport/roles_csv"
match "export_sales", :to => "dataexport/sales_csv"
match "export_shifts", :to => "dataexport/shifts_csv"
match "export_tasks", :to => "dataexport/tasks_csv"
match "export_tickets", :to => "dataexport/tickets_csv"
match "export_types", :to => "dataexport/types_csv"
match "export_users", :to => "dataexport/users_csv"
match "export_visitors", :to => "dataexport/visitors_csv"
match "export_years", :to => "dataexport/years_csv"

有更动态的方法吗?这肯定违背了“DRY”范式,并且想知道是否有人可以帮助我。我想你可以通过用变量替换模型名称来在一行中完成这个,但是我不太确定如何去做这个。

2 个答案:

答案 0 :(得分:2)

为什么不呢:

match "export/:model", :to => "dataexport/export_csv"

并使用params [:model]获取正确的Model,然后指示dataexport控制器export_csv方法向模型询问CSV格式的数据,如:

class DataexportController do
  def export_csv
    params[:model].constantize.export_csv
  end
end

答案 1 :(得分:1)

你可以试试这个:

%w(checkouts committees).each do |model|
  match "export_#{model}", :to => "dataexport/#{model}_csv"
end

显然用你需要的所有模型填充数组。

然而,虽然这会减少代码,但您仍在污染您的路线。您应该考虑可能有更多的Rails方式来做到这一点。

Rails支持的一件事是响应控制器中的不同格式。因此,如果浏览器请求JSON格式,则Rails会提供JSON文件(只要您为其编写代码)。听起来像你可以用CSV格式做同样的事情。

您定义的“导出”实际上只是普通控制器上的索引方法。只是不是将数据显示为HTML,而是将其显示为CSV。我自己并没有真正研究过这个问题,所以我不确定你会怎么做。像这样:

class FooController < ApplicationController
  def index
    respond_to do |format|
      format.html #This will load your standard html index view
      format.csv { #CSV stuff goes here. Perhaps you can get it to load app/views/foo/index.csv.erb somehow }
  end
end

这里有一些讨论:http://weblog.rubyonrails.org/2006/12/19/using-custom-mime-types