1

.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によって提供されます。ApplicationHelperConfigurationPresenter

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

ヘルパーとプレゼンターの両方を利用可能にして変数を渡す適切な方法は何ですか?

4

0 に答える 0