I read a lot about rendering of Rails partitions and representations in rake tasks / background tasks / models. The vast majority of the things that I have found on Stackoverflow and on the Internet describe approaches that work in Rails 3, but they seem deprecated, and I did not make them work (even with a fairly lengthy experiment).
So how can I do partial in a background job in Rails 4?
Here is the best approach that I have developed so far (demonstrated in the console).
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'
Any ideas? Thanks in advance!
Update: tweet_path mentioned above is really undefined. This error occurred due to the link to the path = link_to 'Tweet', [@project, tweet] (slim templates) using an instance variable that will be present in the views inherited from the specific controller, but not when rendering outside this context. I solved this through the appropriate association instead of = link_to 'Tweet', [tweet.project, tweet] .
ruby ruby-on-rails ruby-on-rails-4
Thomas Klemm Aug 15 '13 at 22:54 2013-08-15 22:54
source share