You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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二进制内容存储到本地/云存储,可将文件路径存入数据库方便后续调用:

  1. 首先在控制器头部引入WickedPdf辅助模块:
include WickedPdfHelper
  1. 修改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
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:57:02