2010-11-17 9 views
1

Je suis un étudiant qui est actuellement inscrit dans un programme de technologie de l'information et j'ai reçu un projet qui exige de mon équipe et moi-même de créer un générateur de formulaires dynamique en utilisant Rails 3 + Ruby 1.9.2. Une caractéristique clé de ce générateur de formulaire dynamique sera pour les utilisateurs d'exporter les résultats de leur formulaire. Je n'ai pas eu beaucoup de succès en implémentant la fonctionnalité CSV en utilisant la classe CSV définie dans l'API Ruby 1.9+. Je définis une fonction "export" dans le contrôleur form_results et j'essaie actuellement d'écrire dans un fichier CSV. Ma fonction d'exportation ressemble à ceci:Comment exporter des données de table au format CSV dans Ruby 1.9.2 + Rails3?

def export 
CSV.open("/public/results/results.csv", "wb") do |csv| 
    csv << ["sample", "data"] 
end 
end 

Et dans la vue, je créer un lien vers la fonction en utilisant:

<%= link_to 'Download CSV', form_form_results_path(@form), :method => :export %> 

Je pense que si je peux obtenir la mise en œuvre de la classe CSV fonctionne correctement, Je serai en mesure de terminer le reste de la logique sans problèmes graves. Toute orientation, contribution ou aide sera grandement appréciée.

Merci,

Maz M.

Répondre

2

utilisation du :method est incorrect param. Cela devrait être utilisé pour spécifier les verbes http. Documentation ici: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

Je suggère d'utiliser le bloc respond_to dans l'action où ils sont affichés sous la forme dynamique et utilisez format.csv. Cela vous permet d'utiliser la même action, mais rendre les résultats dans un format différent en se contentant d'appeler l'URL d'action avec .csv ajoutée à l'URL

respond_to do |format| 
    format.html 
    format.csv { render :text => @dynamic_form.to_csv} #this will return txt in browser 
    #format.csv { render :csv => @dynamic_form.to_csv} #with mime type (should prompt browser download) 
end 

Ensuite, dans votre modèle de formulaire, vous pouvez créer une définition de to_csv qui sera rend le csv et le renvoie comme une chaîne. Vous ne devriez vraiment pas mettre une telle logique dans votre contrôleur. Les contrôleurs sont destinés à créer des variables d'instance (où la logique de création doit être effectuée dans les modèles) et à les rediriger vers les vues appropriées. Le modèle devrait contenir la majeure partie de votre logique. google "contrôleurs maigres, gros modèles" pour plus d'informations à ce sujet.

def to_csv 
    csv = some_logic_here_to_create_csv_string 
    csv 
end 

Votre appel link_to chercherais probablement comme ça (en train d'écrire ce du haut de ma tête .. Je ne me souviens pas si cela est la syntaxe correcte):

<%= link_to 'Download CSV', form_form_results_path(@form, :format=>:csv) %> 
1

Vous devriez consulter this lien . Cet épisode de Railscast explique comment exporter des données au format CSV ou XLS. Vous pouvez également consulter le lien this.

Questions connexes