2016-12-17 18 views
0

Я пытаюсь загрузить представление HTML в Rails5 в формате PDF, однако при загрузке PDF я получаю сообщение об ошибке: Не удалось загрузить документ PDF. Я использую следующие камни:Загрузка PDF с использованием ошибки PDFkit в Rails

камень 'Kit PDF' камень 'wkhtmltopdf-бинарная'

вот мой контроллер:

class InputController < ApplicationController 

def index 
    @inputs = Input.all 
end 


def show 
    @input = Input.find_by(id: params[:id]) 

      send_data @pdf, :filename => @input.company + ".pdf", 
            :type => "application/pdf", 
            :disposition => "attachment" 
end 


end 

, когда я типа в URL загрузки, а именно: локальный: 3000/вход/1.pdf я получаю загруженный файл в формате PDF с ошибкой:

enter image description here

Мое шоу взгляд очень прост:

<ul> 
<li><%= @input.company %></li> 
<li><%= @input.position %></li> 
<li><%= @input.date %></li> 
</ul> 

Любая помощь будет принята с благодарностью.

Бест, Аяз

UPDATE

я просто пытался вынимая @pdf и положить в @input:

def show 
    @input = Input.find_by(id: params[:id]) 
      send_data @input, :filename => @input.company + ".pdf", 
            :type => "application/pdf", 
            :disposition => "attachment" 
    end 

Никаких изменений в результатах

+0

После строки '@input =' напишите 'p" ---> # {@ input} <--- "' и проверьте окно сервера, что находится между двумя стрелками. – 7stud

+0

Я получаю объект: "---> # <Вход: 0x007fcbb8cce0d0><---". я сделал p "---> # {@ input.company} <---", и я получил правильный ответ. –

ответ

3

Ваш код не присваивает ничего переменной экземпляра @pdf:

def show 
    @input = Input.find_by(id: params[:id]) 

    send_data @pdf, :filename => @input.company + ".pdf", 
        :type => "application/pdf", 
        :disposition => "attachment" 
end 

и переменные экземпляра имеют значение по умолчанию nil. Вам нужно сделать что-то вроде:

input = Input.find_by(id: params[:id]) 

html = %Q{ 
<ul> 
<li>#{input.company}</li> 
<li>#{input.position}</li> 
<li>#{input.date}</li> 
</ul> 
} 

kit = PDFKit.new(html, :page_size => 'Letter') 
pdf = kit.to_pdf 


send_data pdf, :filename => input.company + ".pdf", 
       :type => "application/pdf", 
       :disposition => "attachment" 

Или, если вы хотите, чтобы прочитать файл представления затем запустить его через двигатель Еврорадио, что-то вроде этого:

file_path = File.expand_path("../views/input/show.html.erb", __FILE__) 
erb_template = File.read(file_path) 

@input = Input.find_by(id: params[:id]) 
renderer = ERB.new(erb_template) 
html = renderer.result() 

#As above... 

Из Rails Guide:

By default, controllers in Rails automatically render views with names that correspond to valid routes.
...
...
The rule is that if you do not explicitly render something at the end of a controller action, Rails will automatically look for the action_name.html.erb template in the controller's view path and render it.

А из документации для send_data():

This method is similar to render plain: data , but also allows you to specify whether the browser should display the response as a file attachment (i.e. in a download dialog) or as inline data

Поэтому, когда вы вызываете в контроллере send_data(), вы явно визуализируете что-то, поэтому рендеринг по умолчанию файла action_name.html.erb не происходит.

+0

@AyazUddin, см. Мои добавления. – 7stud

+0

@AyazUddin Насколько я могу судить, 'send_data()' прерывает обычную последовательность событий, то есть, как правило, действие выполняется, тогда соответствующее представление визуализируется и отправляется в браузер. 'send_data()' указывает рельсам не отображать соответствующее представление. – 7stud

+0

@AyazUddin, я добавил некоторые цитаты из рельсовых документов, которые объясняют, что отправляется обратно в браузер. – 7stud