Rails 3: Comment respond_with csv sans avoir un fichier de modèle?
J'ai un objet qui a une to_csv
méthode et je tiens à le passer à respond_with
de rendre csv à partir de mon contrôleur. Mon code ressemble à ceci:
class Admin::ReportsController < AdminController
respond_to :csv
def trips
respond_with TripReport.new
end
end
Instances de TripReport ont un to_csv méthode.
Quand je fais une demande à cette action, j'obtiens l'erreur suivante:
ActionView::MissingTemplate (Missing template admin/reports/trips with {:formats=>[:csv], :handlers=>[:erb, :builder, :rjs, :rhtml, :rxml], :locale=>[:en, :en]} in view paths
Donc il semble que le contrôleur est à la recherche d'un modèle de fichier de rendu. Comment puis-je contourner ce problème?
Je préfère le format csv a répondu de manière similaire à json, donc il appelle to_csv
sur l'objet et le rend juste la sortie, est-ce possible?
- Salut olivier, avez-vous eu de la chance avec trouver cela? Je suis en cours d'exécution dans le même problème ici.
Vous devez vous connecter pour publier un commentaire.
J'ai été aux prises avec exactement le même problème. J'ai peut-être trouvé une solution.
J'ai trouvé quelques indices lors de la lecture de les Convertisseurs.ajouter le code source pour :json et :xml (le lien est pour les Rails 3.0.10 code, 3.1 pourriez avoir quelques changements déjà):
https://github.com/rails/rails/blob/v3.0.10/actionpack/lib/action_controller/metal/renderers.rb
Tout d'abord, ajoutez une simple
as_csv
méthode de définition de modèle:Cela peut être quelque chose, assurez-vous juste de retour d'un hachage avec des paires clé/valeur. Un Hachage fonctionne mieux qu'un Tableau, comme avec des touches que vous êtes en mesure d'ajouter une ligne d'en-tête à la sortie CSV plus tard. L'idée de
as_csv
vient de Railsas_json
méthode, qui de retour d'un Rubis objet qui est utilisé parto_json
pour générer le réel JSON (texte) de sortie.Avec le
as_csv
méthode en place, placez le code suivant dans un fichier dansconfig/initializers
à l'intérieur de votre application (nom, ilcsv_renderer.rb
, par exemple):Et enfin, ajouter CSV soutien à votre contrôleur de code:
L'initialiseur de code est en grande partie basée sur l' :json et :xml comportement de l'Rails de code source (voir le lien ci-dessus).
Actuellement, le
options
de hachage passé au bloc à ne pas avoir passé à lato_csv
appel, comme CSV est assez pointilleux sur les options, il permet d'être envoyé. Rails ajoute quelques options par défaut en lui-même (comme :modèle et de quelques autres), ce qui vous donne une erreur lors de leur passage àto_csv
. Vous pouvez modifier la valeur par défaut rendu CSV comportement en ajoutant votre propre CSV préféré des options pour l'initialiseur, bien sûr.Espérons que cette aide!
C'est une vieille question, mais voici une mise à jour de la méthode pour le moteur de Rendu personnalisé pour les nouvelles versions de Rails (actuellement à l'aide de 3.2.11 et Ruby 1.9.3) prises à partir de la ActionController::Convertisseurs de documentation: http://api.rubyonrails.org/classes/ActionController/Renderers.html#method-c-add
Comme florish dit, créer un initialiseur mais ajoutez ce code:
Et à l'utiliser comme tel:
Je ne prends pas de crédit pour le code ci-dessus, c'est directement à partir de la documentation, mais cela a fonctionné pour moi dans les Rails 3.2.11 afin de pointage pour les gens à venir à travers ce fil de discussion pour la première fois.
Dans mon projet, je ne suis pas à l'aide d'un to_csv méthode, je suis réellement à la construction du CSV d'abord manuellement. Alors, voici ce que le mien ressemble:
Vous devriez évident de déplacer le CSV code de création à une autre classe ou d'un modèle, mais de le mettre ici inline juste pour illustrer.
Je pense que votre modèle devrait avoir un
to_csv
méthode qui retourne les attributs au format csv.Après que, si les Rails à ne pas faire appel de la
to_csv
méthode implicitement, je voudrais essayer deto_csv
. En passant d'une chaîne à respond_with ne fonctionne pas, c'est attendre quelque chose qui peut répondre àto_#{format}
D'abord créer un moteur de rendu pour le CSV type mime dans
config/initializers/csv_renderer.rb
Puis ajouter un
to_csv
méthode à votre modèle. Si vos données est un tableau de hachage ou vous pourriez envisager de créer une nouvelle classe pour cette collection avec ses propres to_csv et to_json méthodes, au lieu d'avoir tout dans le contrôleur. Si c'est une ActiveRecord modèle, vous pouvez utiliser la commande suivante dans un initialiseur:Vous pouvez ensuite passer un ActiveRecord rapport à respond_with:
J'ai couru dans la ce qui je suppose est un problème similaire à ce que vous ressentez, Oliver. J'ai réalisé que dans mon fichier de routes j'ai été en utilisant
resource
au lieu deresources
. Je ne sais pas si vous avez d'autres actions dans votre Admin::ReportsController classe ou que votre fichier de routes ressemble, mais c'est comment je pourrais résoudre le problème si les Rapports standard RESTE des actions.Si cela ne s'applique pas, exécutez
rake routes
pour voir si vos routes sont configurés correctement.L'une des solutions possibles est de mettre en œuvre un autre point de vue avec toutes les données que vous souhaitez.