2010-04-20 9 views
16

Je suis en train d'utiliser delayed_job de mettre à jour une base de données à distance via xmlrender_to_string en classe lib ne fonctionne pas

Dans mon dossier lib je mets un fichier avec une classe qui devrait faire un render_to_text avec template.xml.builder, mais je reçois:

undefined method `render_to_string' for #<SyncJob:0x7faf4e6c0480>... 

Qu'est-ce que je fais mal?

Répondre

51
ac = ActionController::Base.new() 
ac.render_to_string(:partial => '/path/to/your/template', :locals => {:varable => somevarable}) 
+9

Si vous essayez de l'utiliser avec l'instance variable, allez comme ceci ': locals => {: @instance_variable => valeur}' –

+0

Je reçois erreur de modèle manquant, il semble qu'il ne trouve pas ce partiel et j'ai vérifié plusieurs fois pour l'orthographe. toujours rien .. S'il vous plaît, aidez – AirWick219

+0

Vous obtiendrez l'erreur "Modèle manquant" car ActionController :: Base' va chercher dans le chemin 'action_controller/base'. Déléguez à un autre contrôleur. Il hérite généralement de 'ActionController :: Base' de toute façon. –

3

render_to_string est défini dans ActionController::Base. Comme la classe/module est définie en dehors de la portée des contrôleurs Rails, la fonction n'est pas disponible.

Vous devrez rendre le fichier manuellement. Je ne sais pas ce que vous utilisez pour vos templates (ERB, Haml, etc.). Mais vous allez charger le modèle et l'analyser vous-même.

Donc, si ERB, quelque chose comme ceci:

require 'erb' 

x = 42 
template = ERB.new <<-EOF 
    The value of x is: <%= x %> 
EOF 
puts template.result(binding) 

Vous devrez ouvrir le fichier de modèle et d'envoyer le contenu à ERB.new, mais un exercice qu'il vous reste. Voici les docs pour ERB.

C'est l'idée générale.

2

Vous pouvez transformer votre template.xml.builder en partie (_template.xml.builder), puis le rendre par instanciation d'un ActionView::Base et appelant render

av = ActionView::Base.new(Rails::Configuration.new.view_path) 
av.extend ApplicationController.master_helper_module 
xml = av.render :partial => 'something/template' 

Je ne l'ai pas essayé avec xml encore, mais il fonctionne bien avec html partials .

+2

je reçois: méthode non définie nouvelle » pour Rails :: Configuration: Module –

4

J'ai eu des problèmes avec une méthode d'assistance non défini alors je l'ai utilisé ApplicationController

ApplicationController.new.render_to_string 
+0

Même ici. Avez-vous déjà réparé l'assistant non défini? – nathanengineer

+0

Dans mon cas, j'ai oublié un espace de nom lors de l'appel AplicationController. J'essaie: 'Usr :: ApplicationController.new.render_to_string' Et ça marche. – Germano