Экспорт в PDF из метода Model с использованием render_to_string
Мне нужно реализовать метод _to_pdf в моей модели ProjectBill, который генерирует PDF моего счета в этом месте:
/public/xls/bills/project_#{project.number}_bill_#{bill.number}.pdf
Мое приложение использует HTMLDoc для создания PDF. Я использую Rails 2.3.11. С гемом HTMLDoc мне нужно передать render_to_string моего частичного представления _bill.pdf.haml, которое недоступно в модели (только в контроллерах), в HTMLDoc.
У меня уже есть действие export_to_pdf в моем контроллере, которое запускается пользователем, когда он хочет экспортировать (это работает). Метод модели будет вызываться запланированной задачей, отправителем счетов по электронной почте, когда значение schedule_date равно Date.today.
Я уже пробовал множество решений:
- http://www.omninerd.com/articles/render_to_string_in_Rails_Models_or_Rake_Tasks/print_friendly
- Сделайте действие to_pdf на моем контроллере ProjectBill и вызовите его из Model (но не работает, говоря, что render_to_string не определен, даже если он вызван в Controller)
- Используйте мой рабочий метод export_to_pdf с запросом get, отправленным из моей модели (но я понял, что не могу действительно отправить запрос из модели...)
- Используйте хелпер с render_to_string внутри (не работает: метод undefined)
- и даже больше!
Но все еще не работает.
Может ли кто-нибудь помочь мне с этим вопросом? Я застрял и не могу найти решение...
1 ответ
Ааа, наконец-то я это сделал!
Спасибо за ваш ответ, Шон, но я не искал лучшего драгоценного камня, я искал решение своей проблемы.
По какой-то причине я не смог использовать метод render_to_string в моей модели... Поэтому я создал метод export_to_pdf для моей модели:
def export_to_pdf
bill = self
project = self.project
path = "facture_#{self.project.id}_#{self.bill_number}_#{Date.today.strftime('%Y_%m_%d')}.pdf"
Plus::BillingItemsController.new._to_pdf(bill.id)
if File.exists?(path)
return path
else
return nil
end
end
Как вы можете видеть, я называю мой контроллер в моей модели. Вот мой метод _to_pdf:
def _to_pdf(bill_id)
@bill = Plus::ProjectBill.find_by_id(bill_id)
@project = @bill.project
path = "#{RAILS_ROOT}/public/xls/facture_#{@project.id}_#{@bill.bill_number}_#{Date.today.strftime('%Y_%m_%d')}.pdf"
av = ActionView::Base.new(Rails::Configuration.new.view_path)
av.class_eval do
include ApplicationHelper
include ActionController::UrlWriter
default_url_options[:host] = 'mysite.com'
end
av.extend ApplicationController.master_helper_module
html = av.render(:partial => "/plus/billing_items/bill_for_pdf.haml", :locals => {:bill => @bill})
data = to_pdf(html, false, {:header => '', :headfootsize => 0, :outfile => path})
end
Моя функция to_pdf просто выполняет PDF::HTMLDoc.new и set_option ссылок, логотипов и т. Д. И возвращает pdf.generate
Я надеюсь, что это может кому-нибудь когда-нибудь помочь!