1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[続] Rails Consoleなど任意の場所、Inlineで任意のViewを任意条件でRenderする

Last updated at Posted at 2022-12-26

TL;DR

ac = ApplicationController.new
ac.instance_variable_set(:@user, User.find(42)) # インスタンス変数をインジェクション
ac.render_to_string 'users/show', # レンダリングしたいテンプレート
                    layout: false, # `layout: false`がないとエラー
                    locals: { params: {} } # ローカル変数が使われる際、セットが必要

=> "<!DOCTYPE html>\n<html lang='ja'>\n<head>\n<meta charset='UTF-8'>\n<title>User ID: 42</title>\n</meta>\n</head>\n<body>\n<h1>User Name: Foo</h1>\n</body>\n</html>\n"

本文

去年はとある問題を解決するために、「Rails Consoleなど任意の場所で任意のViewを任意条件でRenderする」 を作成しました。
今年は別件の調査で、wicked_pdfのサンプルコードにて下記の構文を見つかりました。

pdf_html = ActionController::Base.new.render_to_string(template: 'controller_name/action_name', layout: 'pdf')
pdf = WickedPdf.new.pdf_from_string(pdf_html)

この構文は実際に使えるであれば、去年みたいにinlineでコントローラーを作成せずに、もっと手軽にViewをレンダリングできるはずです。

しかしながら、実際使って見ると、ActionController::Baseを使う場合Helperが実行されない問題が見つかりました。
ac.extend(ApplicationHelper) で救済措置を取ってもViewの中では使えませんでした。

幸い海外の記事を漁っている間、ApplicationControllerのインスタンスなら、Helperが使えるとわかりました。

そしてインスタンス変数を利用したい場合は、ネット上でlocals: { @user => User.first }のような書き方がありましたが、実際テストしてみたら使えませんでした。

instance_variable_set(:@user, User.first)を使えば、無事にインスタンス変数をインジェクションできました。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?