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
相关产品推荐
相关产品推荐

