render_to_string в классе lib не работает - PullRequest
17 голосов
/ 20 апреля 2010

Я пытаюсь использовать delayed_job для обновления удаленной базы данных с помощью xml

В моей папке lib я помещаю файл с классом, который должен делать render_to_text с template.xml.builder, но яполучить:

undefined method `render_to_string' for #<SyncJob:0x7faf4e6c0480>...

Что я делаю не так?

Ответы [ 5 ]

54 голосов
/ 26 сентября 2012
ac = ActionController::Base.new()
ac.render_to_string(:partial => '/path/to/your/template', :locals => {:varable => somevarable})
5 голосов
/ 14 июля 2014

У меня были проблемы с неопределенным вспомогательным методом, тогда я использовал ApplicationController

ApplicationController.new.render_to_string
3 голосов
/ 20 апреля 2010

render_to_string определяется в ActionController::Base. Поскольку класс / модуль определен вне области действия контроллеров Rails, функция недоступна.

Вам придется вручную визуализировать файл. Я не знаю, что вы используете для своих шаблонов (ERB, Haml и т. Д.). Но вам нужно будет загрузить шаблон и разобрать его самостоятельно.

Так что, если ERB, что-то вроде этого:

require 'erb'

x = 42
template = ERB.new <<-EOF
  The value of x is: <%= x %>
EOF
puts template.result(binding)

Вам придется открыть файл шаблона и отправить содержимое на ERB.new, но это упражнение осталось для вас. Вот документы для ERB.

Это общая идея.

2 голосов
/ 15 декабря 2010

Вы можете превратить ваш template.xml.builder в частичный (_template.xml.builder), а затем сделать его, создав экземпляр ActionView::Base и вызвав render

av = ActionView::Base.new(Rails::Configuration.new.view_path)
av.extend ApplicationController.master_helper_module
xml = av.render :partial => 'something/template'

Я еще не пробовал его с xml, но он хорошо работает с частями html.

0 голосов
/ 26 февраля 2019

Рельсы 5

render_to_string и другие теперь доступны как методы класса на контроллере. Таким образом, вы можете сделать следующее с любым контроллером, который вы предпочитаете: ApplicationController.render_to_string

Мне специально нужно было назначить динамическую переменную экземпляра для шаблонов на основе класса объекта, поэтому мой пример выглядел следующим образом:

ApplicationController.render_to_string(
  assigns: { :"#{lowercase_class}" => document_object },
  inline: '' # or whatever templates you want to use
)

Отличное сообщение в блоге разработчика, который сделал рельсы PR: https://evilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions

...