Отправка формы с вводом файла с использованием remotipart оборачивает текстовое поле в ответ
Использование Ruby on Rails 4 и Ruby 2.
Вот мое простое действие контроллера. Когда проверка не удалась, я рендерил "новое" действие и вставлял содержимое представления в .ajax-target
дела.
$("body").on("ajax:success", '.remote-form', (e, data, status, xhr) ->
$(this).parent().parent().after(xhr.responseText);
$.colorbox.resize();
).on "ajax:error", '.remote-form', (e, xhr, status, error) ->
$(this).parent().parent().after("Error");
def create
@floor = Floor.new(floor_params)
if @floor.save
render action: 'edit', layout: false
else
render action: 'new', layout: false
end
end
#popupBox.ajax-target
%h1 New Floor
= render 'shared/form_errors', resource: @floor
#formHolder
= simple_form_for @floor, html: { multipart: true, class: 'remote-form' }, remote: true do |f|
= f.input :name, required: true
= f.input :prefix, required: true
= f.input :plan, class: 'file_hidden', label: 'Floorplan'
.clearfix
= f.button :submit, 'Create Floor'
Эта рабочая структура отлично работает для всех типов форм, кроме тех, которые имеют тип ввода файла, в котором есть выбранный файл. Если я отправляю форму с пустыми полями, я вижу, что форма перезагружается нормально. Если я выбираю изображение и оставляю другие поля пустыми (для запуска проверки), я получаю:
Текст "Ошибка" из-за ajax:error
ответ. А также посмотрите это на вкладке Сеть:
<textarea data-type="text/html" data-status="200" data-statusText="OK"><div class='ajax-target' id='popupBox'>
<h1>New Floor</h1>
<div id='popupErrors'>
<ul>
<li>
<strong>Prefix</strong>
has already been taken
</li>
</ul>
</div>
<div class='clearfix'></div>
<div id='formHolder'>
<form accept-charset="UTF-8" action="/floors" class="simple_form remote-form" data-remote="true" enctype="multipart/form-data" id="new_floor" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div> <div class="input string required floor_name"><label class="string required control-label" for="floor_name"><abbr title="required">*</abbr> Name</label><input class="string required" id="floor_name" name="floor[name]" type="text" value="FLR001" /></div>
<div class="input string required floor_prefix field_with_errors"><label class="string required control-label" for="floor_prefix"><abbr title="required">*</abbr> Prefix</label><input class="string required" id="floor_prefix" name="floor[prefix]" type="text" value="FLR001" /></div>
<div class='clearfix'></div>
<div class="input file required floor_plan"><label class="file required control-label" for="floor_plan"><abbr title="required">*</abbr> Floorplan</label><input class="file required" id="floor_plan" name="floor[plan]" type="file" /></div>
<div class='clearfix'></div>
<input class="btn" name="commit" type="submit" value="Create Floor" />
</form>
</div>
</div>
</textarea>
1 ответ
Я знаю, что уже слишком поздно, чтобы ответить, учитывая дату поста. Но я надеюсь, что это будет полезно, если кто-то в конечном итоге ищет ответ.
Функция render_with_remotipart рендерится таким образом, и для этого есть причина. Не беспокоясь о том, что вы можете просто обработать это в JavaScript, см., Например, здесь
Просто сделайте, например. в coffeescript, но вы правильно поняли.
var element = "#parent_element_with_form"
$(form).on 'ajax:remotipartComplete', (e, data) ->
$(element).html($(data.responseText).html())
или же
$(form).on 'ajax:success' && $(form).on 'ajax:error'
в зависимости от ваших условий применения.