Получите ответ действия контроллера от задач и моделей - PullRequest
1 голос
/ 14 февраля 2012

Я бы хотел вызвать действие контроллера из модели.Да, MVC.Спасибо.

Итак, почему я хотел бы вызвать действие контроллера и получить ответ?

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

Настройка:

  • InvoicesController responseds_to: html,: pdf
  • Счет-фактура использует state_machine (: new->: открыто -> оплачено)

Что мне «нужно» в переходе между состояниями: с нового на: открыто

  • создать / invoices /: id.pdf
  • кэшировать PDF как файл Invoice # для последующего использования в delayed_job или simliar

Какой интерфейс я хотел бы использовать в другом месте?

  • @invoice.build_pdf

Есть какие-нибудь предложения?

Обновление: Я хотел бы кэшировать PDF как вложение модели для последующего использования (рассылка delayed_job и т. Д.)

1 Ответ

0 голосов
/ 14 февраля 2012

Может быть лучше взять код, который вы используете в своем контроллере для рендеринга данных PDF, и создать модуль или класс в вашем каталоге lib, скажем, lib/pdf.rb, затем использовать этот код как в вашем контроллере, так и в ваша модель.

Обновление : Вы можете кэшировать сам файл PDF в файловой системе как файл с отметкой времени в качестве его имени или чего-то подобного, которые могут быть уникально идентифицированы. Затем добавьте атрибут file или invoice в модель, чтобы сохранить местоположение в базе данных для последующего использования.

Обновление : Вы можете использовать блочную форму respond_to примерно так:

respond_to do |format|
  format.html
  format.pdf  { InvoiceBuilder.create(@invoice) }
end

Обновление : Похоже, что ActionDispatch::Integration::Session - это класс для создания и интерфейса для интеграционного тестирования. Но я думаю, что вы могли бы использовать его для своих целей. Вы должны быть в состоянии использовать это так:

# app/models/invoice.rb
class Invoice < ActiveRecord::Base
  def get_body
    app = ActionDispatch::Integration::Session.new(Rails.application)
    app.get("invoices/#{self.id}.pdf")
    app.response.body # this returns the rendered content that the browser will see.
  end
end

Другой способ - захватить содержимое с помощью curl, т.е. curl http://localhost:3000/invoices/1.pdf и сохранить вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...