连续的表单提交而不会丢失Rails中的数据?

时间:2013-04-29 07:31:37

标签: ruby-on-rails ruby ruby-on-rails-3

我对控制器和视图交互感到困惑。我有这个初始形式,验证上传的csv文件。 (POST表格)。

成功验证此表单后,我会向用户提供确认详细信息的选项,此确认按钮将作为另一个表单。

问题是我想保留params散列中保存的先前表单值的详细信息。所以基本上我想用第二种形式进行合并。

这可能吗?如果是这样,你可以帮助我使用第二种形式的代码,因为它目前覆盖了以前的形式。两种形式都指向控制器中的相同功能。

<% unless @contents.blank? || @errors.present? %>
    <form name="confirm_bulk_order" method="post" enctype="multipart/form-data" class="search line" action="/orders/create_bulk_order" id="confirm_bulk_order">

      <div class="search-btn-align" id="confirmButton">
        <input type="submit" name="confirm_bulk_order" value="Confirm Order" class="lmargin10 uiButton">
      </div>
    </form>
<% else %>

    <form name="upload_bulk_order_csv" method="post" enctype="multipart/form-data" class="search line" action="/orders/create_bulk_order" id="upload_bulk_order_csv">

      <div class="fileformField">
        <span class="formlabel"> Upload CSV File: </span>
        <input class="required" required="true" type="file" name="datafile"/>
      </div>
      <div class="search-btn-align" id="uploadButton">
        <%= submit_tag 'Validate Bulk Order', :class => 'lmargin10 uiButton' %>
      </div>

    </form>
<% end %>

在控制器订单中

def create_bulk_corder

if @errors.blank? and params[:confirm_bulk_order]=="Confirm Order"        
        #Send the final REST order call
else
   @contents = read_csv_file(params[:datafile]) if params[:datafile].present?
   validate_order(@contents) 
   #Populate @errors etc, etc
   ....
   ....
end

render
end

为了实现这一目标,我必须做出哪些改变?

2 个答案:

答案 0 :(得分:0)

当按下确认按钮时,您丢失了参数,因为它们不是确认表单的一部分。您可以通过添加隐藏字段来避免这种情况:

<form name="confirm_bulk_order" method="post" enctype="multipart/form-data" class="search line" action="/orders/create_bulk_order" id="confirm_bulk_order">
  <!-- This assumes that @contents is a simple value... it's probably not, so you might need several hidden_field_tags here, one for each part of @contents that you want in your params -->
  <%= hidden_field_tag "contents", @contents %>
  <!-- You probably also want to show the user some info about their submission here -->
  <div class="search-btn-align" id="confirmButton">
    <input type="submit" name="confirm_bulk_order" value="Confirm Order" class="lmargin10 uiButton">
  </div>
</form>

如果您采用这种方法,请确保在提交后重新验证params[:datafile],因为恶意用户可以更改此参数值以绕过您的验证逻辑。

另外,我建议将您的行动分为两个单独的行动,同样也适用于观点。你有if-else块,你真的应该有单独的文件。

答案 1 :(得分:0)

我建议使用可以处理多页面表单或向导的gem:https://www.ruby-toolbox.com/categories/rails_wizards