2011-10-17 3 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 controller 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

Смежные вопросы