Ruby on Rails & Prawn PDF - Создать список клиентов - PullRequest
6 голосов
/ 02 апреля 2012

Я пытаюсь создать отчет в формате PDF с помощью Prawn, я могу достаточно легко составить отчет по действию шоу, передав один идентификатор, но я хочу создать его с каждой записью в нем.Как и стандартная страница рельсовых лесов.При использовании рельсов это выглядело бы так:

<% @customer.each do |customer| %>
<%= customer.id %>
<%= customer.name %>
<%end%>

Легко!

Но я не уверен, как это сделать с Креветкой ..

Что-то вроде:

def index
 @customer = Customer.all
  respond_to do |format|
  format.html
   Prawn::Document.generate("customer_list.pdf") do |pdf|
   pdf.text "#{@customer.id} "
    pdf.text "#{@customer.name} "  
       end
    end
end

Что явно не так.

Есть идеи?Спасибо.

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

Это легко сделать с Prawn , Gemfile => gem 'prawn', bundle

Допустим, у вас есть Клиент модель:

Customers_controller.rb

def show
   @customer = Customer.find(params[:id])
   respond_to do |format|
     format.html
     format.pdf do
        pdf = CustomerPdf.new(@customer)
        send_data pdf.render, filename: "customer_#{id}.pdf",
                              type: "application/pdf",
                              disposition: "inline"
     end
   end
end

, а затем просто создайте папку pdfs в папке apps и создайте файл customer_pdf.rb

class CustomerPdf< Prawn::Document

  def initialize(customer)
    super()
    @customer = customer
    text "Id\##{@customer.id}"
    text "Name\##{@customer.name}"
  end

end

show.html.erb

  <div class="pdf_link">
    <%= link_to "E-version", customer_path(@customer, :format => "pdf") %>
  </div>

РЕДАКТИРОВАТЬ:

и не забудьте включить pdf в config / initializers / mime_types.rb

Mime::Type.register "application/pdf", :pdf
2 голосов
/ 06 июня 2012

Я думаю, что хорошим решением вашей проблемы является пользовательский рендер.Лучший подход был описан Хосе Валимом (Jose Valim) (разработчик ядра! Rails) в его книге .Начало первой главы доступно бесплатно здесь .Эта глава действительно то, что вам нужно.

1 голос
/ 17 августа 2016

Вот как я это делаю:

class CustomerPdf< Prawn::Document

 def initialize(customer)
  super(page_size: "A4", page_layout: :portrait)
  @customers = customer
  bullet_list
 end

 def bullet_list
  @customers.each do |customer|
      text "•#{customer.id}- #{customer.name} ", style: :bold
    move_down 5
  end
 end

end
...