2011-10-17 12 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" 

もっと動的な方法がありますか?これは間違いなく "DRY"パラダイムに逆行し、誰かが私にこれを手助けできるかどうか疑問に思っていました。私はモデル名を変数に置き換えるだけで、これを1行で行うことができると考えていましたが、これをどうやって行うのかについてはあまりよく分かりません。

答えて

2

理由だけではない:

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

と使用のparams [:モデル]は直接、その後、正しいモデルを取得するには、このような何かデータエクスポートコントローラ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がサポートしていることの1つは、コントローラのさまざまなフォーマットに対応していることです。 JSON形式がブラウザから要求された場合、JSONファイルがRails用に提供されます(コードを記述している限り)。あなたは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

関連する問題