使用remotipart提交带有文件输入的表单会将textarea包装到响应中

时间:2014-05-07 13:21:06

标签: html ruby-on-rails ajax upload remotipart

使用Ruby on Rails 4和Ruby 2。

这是我简单的控制器动作。验证失败时,我会渲染“新”操作,并将视图内容注入.ajax-target div。

$("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">&lt;div class=&#39;ajax-target&#39; id=&#39;popupBox&#39;&gt;
  &lt;h1&gt;New Floor&lt;/h1&gt;
  &lt;div id=&#39;popupErrors&#39;&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;strong&gt;Prefix&lt;/strong&gt;
        has already been taken
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;div class=&#39;clearfix&#39;&gt;&lt;/div&gt;
  &lt;div id=&#39;formHolder&#39;&gt;
    &lt;form accept-charset=&quot;UTF-8&quot; action=&quot;/floors&quot; class=&quot;simple_form remote-form&quot; data-remote=&quot;true&quot; enctype=&quot;multipart/form-data&quot; id=&quot;new_floor&quot; method=&quot;post&quot; novalidate=&quot;novalidate&quot;&gt;&lt;div style=&quot;margin:0;padding:0;display:inline&quot;&gt;&lt;input name=&quot;utf8&quot; type=&quot;hidden&quot; value=&quot;&amp;#x2713;&quot; /&gt;&lt;/div&gt;    &lt;div class=&quot;input string required floor_name&quot;&gt;&lt;label class=&quot;string required control-label&quot; for=&quot;floor_name&quot;&gt;&lt;abbr title=&quot;required&quot;&gt;*&lt;/abbr&gt; Name&lt;/label&gt;&lt;input class=&quot;string required&quot; id=&quot;floor_name&quot; name=&quot;floor[name]&quot; type=&quot;text&quot; value=&quot;FLR001&quot; /&gt;&lt;/div&gt;
        &lt;div class=&quot;input string required floor_prefix field_with_errors&quot;&gt;&lt;label class=&quot;string required control-label&quot; for=&quot;floor_prefix&quot;&gt;&lt;abbr title=&quot;required&quot;&gt;*&lt;/abbr&gt; Prefix&lt;/label&gt;&lt;input class=&quot;string required&quot; id=&quot;floor_prefix&quot; name=&quot;floor[prefix]&quot; type=&quot;text&quot; value=&quot;FLR001&quot; /&gt;&lt;/div&gt;
        &lt;div class=&#39;clearfix&#39;&gt;&lt;/div&gt;
        &lt;div class=&quot;input file required floor_plan&quot;&gt;&lt;label class=&quot;file required control-label&quot; for=&quot;floor_plan&quot;&gt;&lt;abbr title=&quot;required&quot;&gt;*&lt;/abbr&gt; Floorplan&lt;/label&gt;&lt;input class=&quot;file required&quot; id=&quot;floor_plan&quot; name=&quot;floor[plan]&quot; type=&quot;file&quot; /&gt;&lt;/div&gt;
        &lt;div class=&#39;clearfix&#39;&gt;&lt;/div&gt;
        &lt;input class=&quot;btn&quot; name=&quot;commit&quot; type=&quot;submit&quot; value=&quot;Create Floor&quot; /&gt;
    &lt;/form&gt;
  &lt;/div&gt;
&lt;/div&gt;
</textarea>

1 个答案:

答案 0 :(得分:0)

我知道考虑到帖子的日期,这已经太晚了。但是我希望如果有人最终找到答案,这是有用的。

render_with_remotipart def呈现这种方式并且有一个原因。没有担心你可以在javascript中处理它,例如here

就这样做。在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'

取决于您的申请情况。