2013-05-13 2 views
1

Я использую rails 3.0 и PDFKit. SASS и HAML, но я еще не реализовал конвейер активов.Рельсы 3.0 PDFKit, включают в себя активы и image_tag при генерации PDF, вызванных граблиной задачей

Если я звоню с контроллера, я могу создать идеальный стилизованный pdf с изображениями, вызывая PDFKit.new, передающий render_to_string: show. Но если бы я сделать то же самое через задачу граблей, мой PDF генерируется без стилей, и IMAGE_TAG помощник выдает ошибку, как это:

can't convert nil into String

Конечно, я делаю что-то неправильно в задаче грабли. .. но все работает в контроллере ... Что мне не хватает? Должен ли я включить что-то в задачу рейка? или, возможно, использовать другое представление со встроенными стилями и абсолютными путями? вызовы таковы:

CONTROLLER версия

def generate_html_invoice 
    render_to_string :show, layout: 'mypdflayout' 
end 

mypdf = PDFKit.new html_generator 

RAKE ЗАДАЧА версия

def generate_html_invoice 
    invoice_view = ActionView::Base.new(MyWeb::Application.config.paths["app/views"].first) 
    invoice_view.assign({ ....... various params here}) 
    html_invoice = invoice_view.render(template: "invoices/show", layout: 'mypdflayout') 
return html_invoice 

mypdf = PDFKit.new html_generator 

Та же ошибка возникает при image_tag хелперов и stylesheet_link_tag помощник

Альтернативный способ может быть Instantiate контроллер в задаче грабли, но .. возможно ли это? и, это хорошая практика?

ответ

1

Я не мог найти достойного решения этой проблемы, но я попытался следующие методы:

  • быстро и без

изменить вид с помощью %link и %img HAML TAGS вместо помощников, используя абсолютный путь .

  • МЕДЛЕННО, НО ELEGANT

В задаче граблей, вызовите контроллер получить URL просмотра и передать его PDFKit таким образом

url = "#{(Rails.env.production? ? 'http://www.example.com' : 'http://localhost')}/invoce/#{invoice.id}" 
path_to_pdf = "root/......./mypdf.pdf" 
invoce_page = PDFKit.new url 
invoce_page.to_file(path_to_pdf) 

Это одно решение я выбираю , Я знаю, это немного глупо: контроллер вызывает команду rake, которая снова вызывает контроллер ... И это делает много http-запросов к серверу. Но таким образом я могу создать подземный процесс для создания PDF-счетов, не дожидаясь ответа.

Я думаю, что мне не нужно беспокоиться о перезарядке сервера, потому что запрос будет поставлен в очередь в обычном порядке.

Смежные вопросы