我正在尝试将Rails5中的HTML视图下载为PDF,但是,每当我下载PDF时出现错误:无法加载PDF文档。我使用以下宝石:
gem'pdf kit' gem'wkhtmltopdf-binary'
这是我的控制器:
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时,即:localhost:3000 / input / 1.pdf我得到一个下载的pdf文件,但有错误:
我的节目视图非常简单:
<ul>
<li><%= @input.company %></li>
<li><%= @input.position %></li>
<li><%= @input.date %></li>
</ul>
任何帮助都将不胜感激。
最佳, 阿亚兹
更新
我也试过拿出@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 :(得分: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"
或者,如果你想阅读视图文件,那么通过ERB引擎运行它,如下所示:
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:
默认情况下,Rails中的控制器会自动呈现带有名称的视图 对应有效路线。
...
...
规则是如果你没有在结尾处显式地呈现某些东西 一个控制器动作,Rails会自动寻找 action_name.html.erb模板在控制器的视图路径和渲染中 它
来自send_data()的文档:
此方法类似于
render plain: data
,但也允许您使用 指定浏览器是否应将响应显示为文件 附件(即在下载对话框中)或内联数据
因此,当您在控制器中调用send_data()
时,您将显式呈现某些内容,因此不会发生action_name.html.erb文件的默认呈现。