2013-04-29 1 views
0

Я путаюсь между взаимодействием контроллера и представлений. У меня есть эта начальная форма, которая проверяет загруженный файл csv. (Форма POST).Последовательная подача формы без потери данных в Rails?

После того, как эта форма успешно подтверждена, я даю пользователю возможность подтвердить данные, которые, и эта кнопка подтверждения действуют как другая форма.

Дело в том, что я хочу сохранить данные из предыдущих значений формы, сохраненных в хэше 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, где вы действительно должны иметь отдельные файлы.

+0

Хорошо, давайте посмотрим. Таким образом, все @contents будут удалены во второй раз, когда мы нажмем кнопку подтверждения? –

+0

Да. Каждый submit представляет собой новый вызов сервера, поэтому вы начинаете с нового действия и не устанавливаете переменные. Это основная идея REST: нет никакого состояния, сохраненного между звонками на ваш сервер. – charleyc