如何在create_item执行后调用gen_barcode生成wicked_pdf文档
实现create操作后自动生成wicked_pdf文档的方案
你可以根据你的业务场景选择以下两种实现方式:
方案1:创建完成后直接返回PDF给用户(无需修改现有gen_barcode逻辑)
该方案直接复用你已经调通的PDF路由逻辑,用户创建item完成后会直接跳转获得PDF预览/下载:
def create_item item = Item.new bcode = params[:bcode] item.variant_id = params[:variantid] item.brand_id = params[:brandid] item.luitem_id = params[:itemid] item.createdate = Date.today item.user_id = session[:user_id] # 先判断保存是否成功,避免生成无效PDF if item.save latest_bcode_id = Bcode.maximum(:id) # 重定向到PDF生成路由,指定format为pdf触发PDF渲染 redirect_to genbcode_path(latest_bcode_id, format: :pdf) and return else # 补充保存失败的业务逻辑,比如返回表单提示错误 flash[:error] = "商品创建失败" redirect_to new_item_path and return end end
注意:你原代码中的ditem.save为笔误,需修改为item.save否则会报变量未定义错误
方案2:后台生成PDF并存储到服务器(无需跳转,适合需要留存PDF文件的场景)
该方案会直接生成PDF二进制内容存储到本地/云存储,可将文件路径存入数据库方便后续调用:
- 首先在控制器头部引入WickedPdf辅助模块:
include WickedPdfHelper
- 修改gen_barcode方法适配两种调用场景:
def gen_barcode(skip_render: false) code = Bcode.maximum(:id) # 直接生成PDF二进制内容 pdf_content = render_to_string pdf: "item_#{code}", template: 'layouts/gen_barcode.pdf.erb', outline: { outline: true, outline_depth: 50 }, margin: { top: 35, bottom: 35, left: 35, right: 35 } # 后台生成存储场景 if skip_render # 自定义PDF存储路径,示例存在public/pdfs目录下 save_path = Rails.root.join('public', 'pdfs', "item_#{code}.pdf") FileUtils.mkdir_p(File.dirname(save_path)) File.open(save_path, 'wb') do |file| file << pdf_content end return save_path.to_s # 返回文件路径可存入item字段 # 正常响应请求场景 else respond_to do |format| format.html format.pdf do send_data pdf_content, filename: "item_#{code}.pdf", type: 'application/pdf', disposition: 'inline' end end end end
- create_item中保存成功后直接调用方法即可:
if item.save pdf_path = gen_barcode(skip_render: true) # 可选:将PDF路径存入item对应字段方便后续查询 item.update(pdf_file_path: pdf_path) # 后续跳转逻辑根据你的业务需求自定义 redirect_to items_path, notice: "商品创建成功,PDF已生成" end
注意:如果PDF生成耗时较长,建议将生成逻辑放到异步任务(如Sidekiq)中执行,避免阻塞用户请求
内容的提问来源于stack exchange,提问作者JohnMilo
相关产品推荐
相关产品推荐

