rails5ではrender methodをいたるところで使えるようになっている

rails5にアップデートするときに変更されていて、手を加えて変更したので、備忘録として書いておきます。

rails4.2時代のrenderのやり方

下記のように、requestを強引に擬似るような形でやっていました。

class Renderer
  def renderer
    controller = ApplicationController.new
    controller.request = ActionDispatch::TestRequest.new
    ViewRenderer.new(Rails.root.join('app', 'views'), {}, controller)
  end
end

class ViewRenderer < ActionView::Base
  include Rails.application.routes.url_helpers
  include ApplicationHelper

  def default_url_options
    { host: Rails.application.routes.default_url_options[:host] }
  end
end

Renderer.new.render

こういうやり方ではなく、ActionController::Rendererというクラスメソッドが作られました。

コントローラのアクションの外部で任意のテンプレートでレンダリングするActionController::Rendererを追加。 (Pull Request)

rails/rendering.rb at master · rails/rails · GitHub

ということで、下記のようにすることでrenderをいたるところで呼べるようになりました。

ApplicationController.renderer.render partial: 'topics/image', locals: { url: url, host_name: host_name }

以上です。