Похоже, что помощник по Rails не работает с render_to_string - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь преобразовать виды рельсов в pdf с помощью гема wicked_pdf. Но когда я выполняю команду render_to_string, как это

ActionController::Base.new.render_to_string(template: "templates/pdf_meteo.html.erb", locals: {communaute_meteo_id: id}, layout: 'pdf')

Методы, подобные user_path, не работают и возвращают неопределенную ошибку метода ... (обратите внимание, что страница работает правильно, если я отображаю ее в html) Если кто-томожете мне помочь!

Ответы [ 2 ]

1 голос
/ 31 октября 2019

К сожалению, использование render_to_string не даст вам доступ к URL-помощникам Rails. Один из обходных путей заключается в том, чтобы включить их непосредственно в locals, который вы передаете в шаблон PDF, используя что-то вроде url: Rails.application.routes.url_helpers:

ActionController::Base.new.render_to_string(
  template: "templates/pdf_meteo.html.erb",
  locals: {url: Rails.application.routes.url_helpers, communaute_meteo_id: id}
  layout: 'pdf'
)

И затем внутри вашего шаблона PDF вы бы назвали их с помощью:

url.user_path

Имейте в виду, что по умолчанию помощники URL _path будут относительно , а не абсолютными путями. Вместо этого вы можете использовать _url версию помощников и установить для них host несколькими различными способами. Вы можете настроить их глобально для всего приложения:

# config/environments/development.rb
Rails.application.routes.default_url_options[:host] = 'www.mysite.com'

или настроить их отдельно для каждого помощника внутри вашего шаблона PDF:

url.user_url(host: 'www.mysite.com')

Надеюсь, что вы получите то, что вам нужно!

0 голосов
/ 31 октября 2019

Простейшим способом является использование регулярного рендеринга потока рельсов - с файлом вида your_action_name.pdf.erb, трюк в переопределении formats для партиалов:

<%= render partial:"some_partial", formats:[:html] %>

Также вы можете запустить render_to_string в контексте вашегоу контроллера есть помощники (потому что ActionController::Base ничего не знает о вашем приложении)

...