在处理一些遗留代码(Rails v2.3)时,我陷入了困境。
我有一个视图,它使用嵌入标签来运行生成 PDF 的操作。 从项目中的其他工作视图复制代码,我有指向控制器操作的嵌入代码链接:
<embed height="400px" width="95%" name="plugin" src="<%= formatted_report_reports_path(:pdf) %>" type="application/pdf" />
src 链接到名为
report
的操作,该操作需要视图上名为 params[:startdate]
和 params[:enddate]
的某些参数的值,但一旦嵌入代码运行,这些参数就会在 nil
操作中变成 def report
。
我向自己证明,
embed
标签的工作原理是将一些日期值硬编码到def report
操作中,所以至少我知道当它确实有日期时它是有效的。
我想我可以像这样将
params[:]
传递给 src:
src="<%= formatted_report_reports_path(params[:startdate], :pdf) %>"
但是会返回这样的错误:
undefined method 'has_key?' for :pdf:Symbol
在我的研究中,我发现
:pdf
符号用于确定“格式”,就像我的默认连接路由中的那样。我尝试添加另一个连接以使用 :startdate
符号和格式符号,但这也不起作用:
map.connect ':controller/:action/:startdate.:format'
我的理解是,
params[:]
在整个程序中保持它们的值,并且我很难理解为什么一旦嵌入代码运行该操作它们就为零。我遇到的其他一些线程提到,一旦在 :action
中调用另一个 :controller
,参数值就会被擦除,直到再次设置它们,我猜这就是发生的情况,但是我如何再次设置它们以便嵌入代码会有吗?
我正在看的代码:
report.html.erb
<%- form_tag report_reports_url, :method => 'get' do -%>
<p>
<%= label_tag :startdate, 'Start Date Range' %>
<%= calendar_date_select_tag :startdate, params[:startdate] %>
to
<%= calendar_date_select_tag :enddate, params[:enddate] %>
</p>
<%= submit_tag 'Run Report' %>
<%- end -%>
</p>
</div>
<p></p>
<%- if params[:startdate].nil? -%>
<%- else -%>
<div id = 'results'>
<embed height="400px" width="95%" name="plugin" src="<%= formatted_report_reports_path(:pdf) %>" type="application/pdf" />
</div>
<%- end -%>
reports_controller.rb
def report
respond_to do |format|
format.html do
end
format.pdf do
pdf = make_report_pdf(params[:startdate],params[:enddate])
if pdf.nil?
else
send_file pdf, :type=> "application/pdf", :disposition => "inline"
end
end
end
end
...参数值会被擦除,直到再次设置它们,我猜这就是发生的情况,但是我如何再次设置它们以便嵌入代码能够拥有它?
是的,确实是这样。
params
仅具有给定请求的生命周期。
我在这里猜测了一点,但我认为你需要这个来进行路径调用:
formatted_report_reports_path(:startdate => params[:startdate], :format ⇒ :pdf)