2011-10-17 32 views
1

我有这个网站,我希望能够使用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" 

有没有更动态的方式做到这一点?这绝对违背了“干”的范例,并想知道是否有人可以帮助我。我在想,你可以通过用一个变量替换模型名称来做到这一点,但我不太清楚如何去做这件事。

回答

2

为什么不干脆:

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

,并使用PARAMS [:模式],以获得正确的模型,然后直接dataexport控制器的export_csv方法向模型询问CSV格式的数据,如:

class DataexportController do 
    def export_csv 
    params[:model].constantize.export_csv 
    end 
end 
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