.txt.erb
プレゼンターを使用して値を表示するファイルをレンダリングしようとしています。次のコードはConfigurationWorker
、resque によって実行される内部にあります。
@configuration = Configuration.first
@view = Rails.root.join 'lib', 'templates', 'config.txt.erb'
ERB.new(File.read(@view)).result(binding)
は次のconfig.txt.erb
ようになります (簡単にするために短縮されています)。
<% present @configuration do |presenter| %>
Name <%= presenter.name %>
<% end %>
一方、およびpresent
によって提供されます。ApplicationHelper
ConfigurationPresenter
module ApplicationHelper
def present(object, klass = nil)
klass ||= "#{object.class}Presenter".constantize
presenter = klass.new(object, self)
yield presenter if block_given?
return presenter
end
end
class ConfigurationPresenter < ApplicationPresenter
presents :configuration
delegate :name, :configuration
# Presenter methods omitted
end
class ApplicationPresenter
def initialize(object, template)
@object = object
@template = template
end
def self.presents(name)
define_method(name) do
@object
end
end
def method_missing(*args, &block)
@template.send(*args, &block)
end
end
ただし、これによりNoMethodError: undefined method present for ConfigurationWorker:Class
.
次のような他のアプローチも試しました
@configuration = Configuration.first
renderer = ApplicationController.view_context_class.new
renderer.render :file => Rails.root.join('lib', 'templates', 'config.txt.erb')
になりますActionView::Template::Error: uninitialized constant NilClassPresenter
。
ヘルパーとプレゼンターの両方を利用可能にして変数を渡す適切な方法は何ですか?