Как мне сделать render_to_string в модели рельсов? - PullRequest
2 голосов
/ 09 октября 2011

Как мне render_to_string в модели в рельсах?

Если вы скажете, что «вы никогда не должны ничего делать из модели. Любой рендеринг - вообще - это ответственностьКонтроллер и просмотр. "Выслушай меня или предложи лучший способ решить проблему

Моя модель - почтовик.Только не электронная почта, факсы.

Ответы [ 3 ]

3 голосов
/ 15 мая 2012

Вот рабочий код:

# instance_vars must follow the '@name' convention.
#
def render_template( template_content, options={} )
  local_vars    = options[ :local_vars    ] || {}
  instance_vars = options[ :instance_vars ] || {}

  view = ActionView::Base.new( Rails::Configuration.new.view_path )

  instance_vars.each do | name, value |
    view.instance_variable_set( name, value )
  end

  rendering_options = {
      :inline => template_content,
      :type   => :builder,
      :locals => local_vars
  }

  view.render( rendering_options )
end

Проверено на Rails 2.3.14.Заметьте, что я не нашел эту идею, а просто обернул ее удобным способом.

Конечно, не думайте, что я поддерживаю рендеринг представлений в моделях из-за этого; -)

3 голосов
/ 09 октября 2011

Если вы ищете элегантное решение, возможно, вы могли бы реализовать ActionFaxer :: Base. Вы сможете следить за реализацией ActionMailer :: Base , но специализировать ее для факсов. При таком подходе вы должны получить доступ к render_to_string.

Следует отметить, что в этом случае вы не добавляете render_to_string в модель, а вместо этого вводите концепцию факсера, которая будет работать с моделями.

Если вам просто нужна произвольная поддержка для рендеринга шаблонов внутри модели, вы можете написать код непосредственно в erb или другой реализации языка шаблонов.

Приятной особенностью концепции Faxer является то, что она может абстрагироваться от простого рендеринга, включая такие вещи, как диспетчеризация, организация очередей и гарантированная доставка.

Если вы добились успеха, возможно, когда вы закончите, вы можете превратить его в драгоценный камень.

0 голосов
/ 07 ноября 2013

Если вы нашли это и хотите сделать это на Rails 3, эта суть была большой помощью:

https://gist.github.com/aliang/1022384

...