Rails PDFKit выдает ActionController: UnknownFormat только на Heroku - PullRequest
0 голосов
/ 28 февраля 2019

Поэтому я пытаюсь разработать приложение, которое позволит вам конвертировать продукт в этикетку с QR-кодом.Используя гем PDFKit и wkhtmltopdf, он отлично работает локально.Но на Heroku он выдает мне HTTP 406 и следующую ошибку рельсов: ActionController::UnknownFormat (OrderController#print is missing a template for this request format and variant. request.formats: ["application/pdf"] request.variants: []).Я искал форумы, но не могу найти никого, кто сталкивался с той же проблемой.Я также следовал руководству на gitub PDFKit для использования heroku, ссылка на руководство .Это означает, что у меня есть как wkhtmltopdf-binary gem, так и wkhtmltopdf-heroku gem.

соответствующие фрагменты кода:

#in app/views/order/show.html.erb
<%= link_to "Print QR-code", print_order_path(@order, :format => :pdf), class 'btn btn-primary' %>



#in app/config/initializers/pdfkit.rb
PDFKit.configure do  |config|
if File.executable? 'app/.apt/usr/local/bin/wkhtmltopdf'
   config.wkhtmltopdf = 'app/.apt/usr/local/bin/wkhtmltopdf'
end


#app/controllers/order_controller
def print
@order = Order.find(params[:id])
end

#app/views/order/print.html.erb
<div style="display: inline-block">
   <table class="QR" style="width:100%">
       <tr style="margin:30px">
           <td class="QR">
               <% @qr = RQRCode::QRCode.new(@order.qr_code.to_s, :size => 6)%>
               <%= raw @qr.as_svg(offset:0, color: '000',shape_rendering: 'crispEdges', module_size:4) %>
           </td>
           <td style="font-size:50px;padding:20px; text-align:center">
               <%=@order.garment.to_s%><br>
               <%=@order.size.to_s%>
           </td>
        </tr>
   </table>
</div>

После добавления блока с response_to, предоставленного srng, я вместо этого получаю следующую ошибку:

ActionView::MissingTemplate(Missing template order/print, application/print with {:locale =>[:sv], :formats =>[:pdf], :variants => [], :handlers => [:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}

1 Ответ

0 голосов
/ 28 февраля 2019

Мне не хватает блока формата.Это то, что он ищет.

Вам нужно добавить блок в ваш метод Order.rb #print;

// order_controller.rb 
def print
    @order = Order.find(params[:id])
    respond_to do |format|
        # format.html
  format.pdf do
    send_data PDFKit.new( render_to_string 'print', order: @order ).to_pdf
        end
    end
end

РЕДАКТИРОВАТЬ: Свято-вау, это было весело.

1- Добавьте файл с именем print.pdf.erb в вашу папку views / order 2 - Содержимое такое же, как у print.html.erb 2 - Используйте блок форматирования выше, я закомментировалHTML-формат как ненужный

РЕДАКТИРОВАТЬ 2: Видя, как это работает локально и на Heroku с моей стороны, я просто собираюсь скопировать / вставить весь код здесь для прямого сравнения.У меня нет класса qr, и мои атрибуты отличаются, но вы можете понять это.

//orders_controller.rb
def print
    @order = Order.find(params[:order_id])
    respond_to do |format|
      format.html
      format.pdf do
        send_data PDFKit.new( render_to_string 'print', order: @order ).to_pdf
      end
    end
  end

  # GET /orders
  # GET /orders.json
  def index
    @orders = Order.all
  end

  # GET /orders/1
  # GET /orders/1.json
  def show
  end
....

//views/orders/show.html.erb
<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @order.name %>
</p>

<p>
  <strong>Thing:</strong>
  <%= @order.thing %>
</p>
<%= link_to 'Print', order_print_path(@order, :format => :pdf) %> |

<%= link_to 'Edit', edit_order_path(@order) %> |
<%= link_to 'Back', orders_path %>

//views/order/print.html.erb
<div style="display: inline-block">
  <table class="QR" style="width:100%">
    <tr style="margin:30px">
      <td class="QR">

      </td>
      <td style="font-size:50px;padding:20px; text-align:center">
        <%=@order.name%><br>
        <%=@order.thing%>
      </td>
    </tr>
  </table>
</div>

//views/orders/print.pdf.erb
<div style="display: inline-block">
  <table class="QR" style="width:100%">
    <tr style="margin:30px">
      <td class="QR">

      </td>
      <td style="font-size:50px;padding:20px; text-align:center">
        <%=@order.name%><br>
        <%=@order.thing%>
      </td>
    </tr>
  </table>
</div>

//Gemfile
gem 'pdfkit'
gem 'wkhtmltopdf-heroku'

//config/routes.rb
resources :orders do
    get 'print', to: 'orders#print'
  end
...