【问题标题】:How to stash form data in order to show confirmation page before submission如何存储表单数据以便在提交前显示确认页面
【发布时间】:2012-06-30 14:07:55
【问题描述】:
我有一个很长的多部分表单,其中包括文件输入字段。我的客户希望用户能够在将数据发送到远程服务器之前查看他们输入的数据。当前工作的实现只是获取表单数据并将其提交给外部 Web 服务。由于已经编写了大量的验证和 SOAP 请求样板,因此我只是在它们之间添加了一个控制器操作。因此,我需要做的就是将提供给“Review”操作的表单数据发送到“Submit”操作。
这里是到目前为止涉及的控制器和视图的流程:
- 呈现表单,用户输入数据,点击“继续”
- 表单被验证,然后表单数据被发送到“review”页面
- 查看页面的操作会创建
params[:clean] 并使用人类可读的表单数据填充它
- View 显示带有选项的表格 |数据,底部有一个“提交”按钮
到目前为止我尝试过的:
-
session[:form_data] = params 这会导致“无法转储文件”错误
考虑过但如果可能的话宁愿避免:
- 在“审查”视图上创建另一个表单,该表单从参数和 POST 填充到提交 url
值得注意的是,上传的文件没有被应用程序处理。客户端的 SOAP 架构处理所有事情 - 我只需要一个保存表单数据的页面,然后在客户满意的情况下将其传递。
【问题讨论】:
标签:
ruby-on-rails
forms
file
post
upload
【解决方案1】:
这就是我最终做的事情
在“审查”动作中:
session[:uploaded_files_array] = Array.new
session[:application_data] = params.except(*exclusions, *files)
if params[:uploaded_file]
params[:application_data][:uploaded_file] = true
file_name = session[:current_customer] + "more_stuff"
uploaded_path = File.join(Dir.tmpdir, file_name)
File.open(uploaded_path, "wb") do |f|
f.write(params[:uploaded_file].read)
end
session[:uploaded_files_array] << uploaded_path
end
在“提交”动作中:
uploaded_files_array = session[:uploaded_files_array]
params = session[:application_data]
unless uploaded_files_array.blank?
Resque.enqueue(ConfirmationDocumentUploader, uploaded_files_array, session[:current_customer] ["DocumentID"] )
end
所以基本上,我将上传的文件写入文件系统中的临时位置,并将它们的位置存储在会话中。我还将所有相关参数从 params 复制到会话中。然后,在提交过程中,我只需从会话中读取覆盖参数,并使用路径数组为文件排队工作。
希望这对其他人有用,我想拥有一个评论页面,以便客户可以确认他们的选择,是一个相当普遍的愿望。