Этот учебник просто мусор. Вы можете сделать то же самое (или, по крайней мере, то, что я думаю, что вы пытаетесь сделать) RESTful, не добавляя никаких дополнительных маршрутов, просто используя ActionController :: MimeResponds :
class ContratosController < ApplicationController
# GET /contratos/1
# GET /contratos/1.pdf
# GET /contratos/1.docx
def show
respond_to do |format|
format.html {}
format.pdf { send_file Contratos::PdfConverter.call(@contrato) }
format.docx { send_file Contratos::XMLConverter.call(@contrato) }
end
end
end
Ключ вот держи свой контроллер тощий. Контроллеры, как известно, сложно тестировать.
На самом деле мы еще не объявили Contratos::PdfConverter
, но это единственное место, где вы можете просто использовать шаблон объекта службы :
# app/services/base_service.rb
class BaseService
def self.call(*args, **kwargs, &block)
new(*args, kwargs, &block)
end
end
# app/services/contratos/docx_converter.rb
module Contratos
class DocxConverter < BaseService
# @return [Pathname]
def call(contrato)
path = Rails.root.join("public", "example.docx")
Caracal::Document.save(path) do |docx|
docx.style do
id 'Body'
name 'body'
font 'Times New Roman'
size 24
end
docx.h2 'Contrato'
docx.p do
style 'Body'
text 'Lorem ipsun dolor sit amet'
text contrato.day # ...
end
end
path
end
end
end
# app/services/contratos/pdf_converter.rb
module Contratos
class PdfConverter < BaseService
def call(contrato)
# generate PDF here
end
end
end
Это позволяет вам тестировать конвертацию отдельно и избегать превращения вашего контроллера в пылающую кучу мусора.