Экспорт в 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

Я надеюсь, что это может кому-нибудь когда-нибудь помочь!

Другие вопросы по тегам