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

Rails 2.3嵌入视图传参至PDF生成Action遇阻求助

Rails 2.3遗留项目:Embed调用PDF接口丢失日期参数的解决办法

问题背景

维护Rails 2.3版本的遗留代码时,遇到以下问题:

  • 通过表单提交startdate和enddate后,视图里用<embed>标签调用report接口生成PDF时,接口内的params[:startdate]和params[:enddate]变为nil
  • 硬编码日期值时,PDF能正常生成,说明<embed>本身功能正常
  • 尝试用src="<%= formatted_report_reports_path(params[:startdate], :pdf) %>"传参,报错undefined method 'has_key?' for :pdf:Symbol
  • 添加路由规则map.connect ':controller/:action/:startdate.:format'后问题仍未解决

核心原因

<embed>发起的是独立HTTP请求,不会自动继承当前页面的params参数;同时Rails 2.3的路由助手formatted_*_path传参方式错误,直接传递:pdf符号会被当作哈希参数处理,导致解析异常。

解决方案

方法1:通过查询参数传递日期(推荐,无需修改路由)

直接在路由助手中以哈希形式传递startdate、enddate和format参数,Rails会自动将它们拼接为URL查询参数。

修改视图中<embed>的src属性:

<embed height="400px" width="95%" name="plugin" 
       src="<%= formatted_report_reports_path(:pdf, :startdate => params[:startdate], :enddate => params[:enddate]) %>" 
       type="application/pdf" />

或者用更通用的url_for写法:

<embed height="400px" width="95%" name="plugin" 
       src="<%= url_for(:controller => 'reports', :action => 'report', :format => 'pdf', :startdate => params[:startdate], :enddate => params[:enddate]) %>" 
       type="application/pdf" />

方法2:通过路由参数传递日期(需调整路由)

如果希望将日期放在URL路径中,先修改路由规则:

# config/routes.rb
map.connect 'reports/report/:startdate/:enddate.:format', 
            :controller => 'reports', 
            :action => 'report'

再修改视图中的路径写法:

<embed height="400px" width="95%" name="plugin" 
       src="<%= formatted_report_reports_path(params[:startdate], params[:enddate], :pdf) %>" 
       type="application/pdf" />

⚠️ 注意:这种方式需要确保日期格式不包含/等URL特殊字符,否则会导致路由解析错误,因此更推荐方法1。

验证修改

修改后重新提交表单,<embed>发起的请求会携带startdate和enddate参数,控制器的report方法就能正常获取到这两个值,生成对应的PDF。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:05:20