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

Rails应用中覆盖PrawnRails Gem方法后PDF字体大小修改不生效问题

解决prawn_rails中覆盖make_field_box方法不生效的问题

你的问题核心出在模块加载顺序和Ruby的include机制上——当你用DocumentExtensions.module_eval修改方法时,这个模块已经被Prawn::Document类包含了,而Ruby在include模块时会把模块的方法复制到目标类中,后续修改模块的方法不会自动同步到类的现有方法。

给你两种可靠的解决方案:

方案1:直接重写Prawn::Document的方法

最直接的方式是直接在Prawn::Document类上重新定义make_field_box方法,确保你的实现覆盖原有的方法。修改你的config/initializers/prawn_rails.rb文件如下:

require 'prawn_rails_forms'

Prawn::Document.class_eval do
  def make_field_box(field)
    stroke_bounds
    bounds.add_left_padding 2
    move_down 2
    text field.upcase, size: 18
  end
end

方案2:用prepend模块来覆盖方法

如果你更倾向于用模块的方式扩展,可以通过prepend来让你的自定义方法优先执行(prepend会把模块插入到类的继承链最前端,比include的优先级更高):

require 'prawn_rails_forms'

module CustomPrawnFieldHandling
  def make_field_box(field)
    stroke_bounds
    bounds.add_left_padding 2
    move_down 2
    text field.upcase, size: 18
  end
end

# 将自定义模块prepend到Prawn::Document中
Prawn::Document.prepend(CustomPrawnFieldHandling)

为什么原来的代码不生效?

当PrawnRailsForms被加载时,它会把DocumentExtensions模块include到Prawn::Document类中。此时Prawn::Document已经拥有了make_field_box方法的副本,后续你修改DocumentExtensions模块的方法,不会影响Prawn::Document已经存在的方法——因为Ruby的include是一次性拷贝方法,而不是动态绑定模块方法到类上。

重启服务器后,这两种方案都能让你的自定义字体大小生效。

内容的提问来源于stack exchange,提问作者Mervyn Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:27:31