Rendern von partials / view in einem rake-task / hintergrund-job / model in Rails 4
Ich habe viel gelesen über die Erbringung von Schienen Teiltöne und Ansichten in rake tasks /hintergrund-jobs /Modelle. Die überwiegende Mehrheit der Dinge, die ich gefunden habe, auf Stackoverflow und den web-beschreiben Ansätze der Arbeit in Rails 3, aber Sie scheinen veraltet und ich habe nicht um Ihnen zu arbeiten (auch mit ziemlich einige Zeit Experimentieren).
So, wie kann ich Rendern teilweise in einem hintergrund-job in Rails 4?
Hier ist der beste Ansatz, den ich habe, funktioniert so weit (nachgewiesen in der Konsole).
c = ApplicationController.new
result = c.render_to_string(partial: 'tweets/tweet', locals: {tweet: Tweet.first})
# =>
# Tweet Load (0.8ms) SELECT "tweets".* FROM "tweets" ORDER BY "tweets"."id" ASC LIMIT 1
# Author Load (0.6ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 ORDER BY "authors"."id" ASC LIMIT 1 [["id", 1]]
# Status Load (0.6ms) SELECT "statuses".* FROM "statuses" WHERE "statuses"."twitter_id" = 367523226848866304 LIMIT 1
# Rendered tweets/_tweet_body.html.slim (17.5ms)
# Rendered tweets/_resolved_tweet.html.slim (23.7ms)
# Rendered tweets/_tweet.html.slim (28.1ms)
# ActionView::Template::Error: undefined method `tweet_path' for #<#<Class:0x007fb21bf797a0>:0x007fb21cb009e8>
# from /Users/thomasklemm/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/routing/polymorphic_routes.rb:129:in `polymorphic_url'
Irgendwelche Ideen? Vielen Dank im Voraus!
Update: Die tweet_path
oben erwähnt, ist in der Tat nicht definiert. Dieser Fehler resultiert aus der Verknüpfung auf einen Pfad = link_to 'Tweet', [@project, tweet]
(slim-Vorlagen) über eine Instanz-variable, die vorhanden wäre, in Aussicht auf Erben von einem bestimmten controller, aber nicht beim Rendern außerhalb von diesem Kontext. Ich löste dies werde durch den entsprechenden Verein statt = link_to 'Tweet', [tweet.project, tweet]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich zusammengestellt aus vielen Quellen und was für mich funktioniert in Rails 4.
Mit diesem Renderer-Klasse, die Sie sollten in der Lage sein zu erbringen Schienen 4 views und partials in jedem Kontext, wie hintergrund-jobs, service, Objekte, Modelle, Arbeitnehmer, Mitarbeiter, you name it.
Update:
Scheint es eine einfachere Lösung: http://makandracards.com/makandra/17751-render-a-view-from-a-model-in-rails
Update 2:
Es ist ein Juwel namens
render_anywhere
, der es ermöglicht, den Aufruf "Rendern" von überall: Modelle, hintergrund-jobs, Rechen-Aufgaben, etc.Update 3:
In Schienen 5, der renderer wurde extrahiert und kann standalone genutzt werden von hintergrund-jobs und anderen Orten:
Für Rails <= 4.2, kann diese Funktion zurückportiert werden mit der backport_new_renderer gem.
render_anywhere
versuchen und sehen, ob Helfer werden kann, enthalten.render_anywhere
Edelstein?link_to
es wirft diese Fehlermeldung:ActionView::Template::Error: arguments passed to url_for can't be handled. Please require routes or provide your own implementation
Wie haben Sie dies zu umgehen?Stellen Sie sicher, dass das laden der rails-Umgebung in den job. Wenn es das ist bereits getan, können Sie versuchen, so etwas wie:
MyEngine::Engine.app.url_helpers
(rails 4)