2013-08-06 12 views
5

Ich verwende Rabl XML-Ausgabe in einer Harke Aufgabe zu generieren:Rabl.render: Wie benutzt man View-Helfer-Methoden?

xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
# do stuff with xml 

Ich brauche aber mehrere Hilfsmethoden in der Rabl View-Datei zu verwenden, Bezug genommen wird, und ich erhalte ein NoMethodError wie ich aus dem erwarteten Antwort auf this question.

Ich versuchte extends und include in der Klasse von dem Rake-Task verwendet verwenden, aber ich immer noch die gleichen Fehler auf den Hilfsmethoden erhalten:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 

class SerializeData 
    extends FeedsHelper 

    def perform 
    xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
    # do stuff with xml 
    end 
end 

Meine Frage ist: Gibt es eine Möglichkeit, Hilfsmethoden zu verwenden, in Dateien, die auf diese Weise erstellt wurden? (oder zumindest so, dass ich sie immer noch als String in einer Rake-Task darstellen kann). Die Hilfsmethoden werden viele, viele Male verwendet, um verschiedene Daten nach festgelegten Anforderungen korrekt zu formatieren, so dass es sehr schwierig wäre, sie vollständig zu entfernen .

Antwort

5

Ich endete mit einer Affe-fleckige Lösung.

Ich bemerkte, dass die NoMethodFound Fehler von einer Instanz der Rabl::Engine Klasse kam, so enthalten ich die benötigten Routing und Hilfsmethoden in dieser Klasse und war dann in der Lage auf sie zuzugreifen:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 
... 
class Rabl::Engine 
    include Rails.application.routes.url_helpers 
    include FeedsHelper 
end 

Beachten Sie auch, dass die URL-Host muss bei Verwendung von url zusätzlich zu path Helfer gesetzt werden (zB root_url und root_path):

Rails.application.routes.default_url_options[:host] = "www.example.com" 

ich würde auf jeden Fall eine nicht bevorzugen affe-patch-Lösung oder mindestens eine, bei der abhängig von der Steuerung der ausgeführten Aktion Helfer hinzugefügt werden können. Ich werde warten, um das zu akzeptieren, um zu sehen, ob jemand mit einer solchen Antwort kommen kann.

4

Sie können ein Scope-Objekt mit dem Parameter scope übergeben. Also, wenn Sie Zugriff auf ein Objekt haben mit den Helfern eingeschlossen, wie wenn in der Ansicht Kontext, dann können Sie passieren, dass zB:

<%= Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: self).html_safe%> 

So außerhalb der Ansicht Kontext Sie in einer Gewohnheit führen müssen Objekt mit den Helfern enthalten, um dies sauber zu machen. zB

class RakeScope 
    include FeedHelper 
end 

Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: RakeScope.new()) 

Ich habe die zweite Option nicht versucht, aber die erste, funktioniert super.

0

Während nicht ganz das gleiche Problem, hatte ich ein ähnliches Problem beim Zugriff auf Helfer aus RSpec-Spezifikationen. Ich habe eine Hilfsfunktion erstellt, die einen Bereich erstellt, mit dem Sie alle benötigten Helfer hinzufügen können. Das Folgende gab mir Zugriff auf die Pfad- und URL-Hilfsmethoden und etwas Ähnliches sollte für Rake funktionieren.

#spec/support/rabl_helper.rb 
def render_rabl(object, options={}) 
    options = { 
    format: 'json', 
    view_path: 'app/views', 
    file:  example.example_group.top_level_description, 
    scope:  RablScope.new 
    }.merge(options) 

    result = Rabl.render(object, options.delete(:file), options) 
    options[:format] == 'json' ? JSON.parse(result) : result 
end 

class RablScope 
    include Rails.application.routes.url_helpers 
end