rakeタスク/バックグラウンドジョブ/モデルでのRailsパーシャルとビューのレンダリングでは、多くのことを読みました。私がStackoverflowとWebで見つけた大部分のものは、Rails 3で作業するアプローチを記述していますが、古くなっているように見えます(実験にかなりの時間を費やしても)。rakeタスク/バックグラウンドジョブ/モデルのRailsでの部分/ビューのレンダリング
したがって、は、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]
(スリムテンプレート)にリンクすることによって発生しましたが、このコンテキスト外ではレンダリングされませんでした。私はこれを代わりに適切な関連付けを介して解決した= link_to 'Tweet', [tweet.project, tweet]
。
「より簡単な解決策」は機能しますが、テンプレートでよく使用される「link_to」のような機能にはアクセスできません。どちらの解決策も、アプリケーション固有のヘルパーへのアクセスを提供していないようです。 –
@JeremyBurton ['render_anywhere'](https://github.com/yappbox/render_anywhere)に試してみて、そこにヘルパーを含めることができます。 –
私は実際に、ViewRendererクラスで必要なヘルパーモジュールを単に組み込むだけで、この問題を解決しました。ありがとう。 –