我对控制器和视图交互感到困惑。我有这个初始形式,验证上传的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
为了实现这一目标,我必须做出哪些改变?
答案 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