Я много читал о рендеринге партиций Rails и представлений в рейк-задачах/фоновых заданиях/моделях. Подавляющее большинство вещей, которые я нашел в Stackoverflow и в Интернете, описывают подходы, работающие в Rails 3, но они кажутся устаревшими, и я не заставил их работать (даже с довольно продолжительным экспериментом).
Итак, как я могу выполнить частичное в фоновом задании в Rails 4?
Вот лучший подход, который я разработал до сих пор (продемонстрированный в консоли).
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'
Любые идеи? Спасибо заранее!
Обновление: tweet_path
, упомянутое выше, действительно не определено. Эта ошибка возникла из-за ссылки на путь = link_to 'Tweet', [@project, tweet]
(slim templates) с использованием переменной экземпляра, которая будет присутствовать в представлениях, наследуемых от определенного контроллера, но не при визуализации вне этого контекста. Я решил это через соответствующую ассоциацию вместо = link_to 'Tweet', [tweet.project, tweet]
.