1

我有一个很长的多部分表单,包括文件输入字段。我的客户希望用户能够在将数据发送到远程服务器之前查看他们输入的数据。当前工作的实现只是获取表单数据并将其提交给外部 Web 服务。由于已经编写了大量的验证和 SOAP 请求样板,因此我只是在它们之间添加了一个控制器操作。因此,我需要做的就是将提供给“Review”操作的表单数据发送到“Submit”操作。

这是到目前为止涉及的控制器和视图的流程:

  • 呈现表单,用户输入数据,点击“继续”
  • 表单被验证,然后表单数据被发送到“review”页面
  • 视图页面的操作创建params[:clean]并使用人类可读的表单数据填充它
  • 查看带有选项的显示表 | 数据,底部有一个“提交”按钮

到目前为止我已经尝试过:

  • session[:form_data] = params这会导致“无法转储文件”错误

考虑过但如果可能的话宁愿避免:

  • 在“评论”视图上创建另一个表单,该表单从参数和 POST 填充到提交 url

值得注意的是,上传的文件没有被应用程序处理。客户端的 SOAP 架构处理所有事情——我只需要一个保存表单数据的页面,然后在客户满意的情况下将其传递。

4

1 回答 1

0

这是我最终做的

在“审查”行动中:

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 复制到会话中。然后,在提交过程中,我只需从会话中读取覆盖参数,并使用路径数组为文件排队工作。

希望这对其他人有用,我想拥有一个评论页面,以便客户可以确认他们的选择,是一个相当普遍的愿望。

于 2012-06-29T22:14:03.163 回答