0

コントローラーとビューの相互作用の間で混乱しています。アップロードされたcsvファイルを検証するこの初期フォームがあります。(投稿フォーム)。

このフォームが正常に検証された後、ユーザーに詳細を確認するオプションを提供します。この確認ボタンは別のフォームとして機能します。

問題は、params ハッシュに保存された以前のフォーム値の詳細を保持したいということです。したがって、基本的には、2 番目のフォームとのマージを実行したいと考えています。

これは可能ですか?もしそうなら、2 番目のフォームのコードを手伝ってもらえませんか。現在、前のフォームを上書きしています。どちらの形式も、コントローラー内の同じ関数を指しています。

<% 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

これを可能にするには、どのような変更を加える必要がありますか?

4

2 に答える 2

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]後に必ず再検証してください。悪意のあるユーザーがこのパラメーター値を変更して、検証ロジックを回避する可能性があるためです。

また、あなたのアクションを 2 つの別々のアクションに分解することをお勧めします。ビューについても同様です。本当に別のファイルを持つべき場所に if-else ブロックがあります。

于 2013-04-29T07:52:57.527 に答える