这两天尝试学习用 jQuery file upload+Carrierwave 做文件上传功能,使用的是 simple_form,结果碰到了一个很奇怪的问题,在学习 Railscasts 381 jQuery file upload 的时候里面明确的说了当 input field 的 multiple 设置为 true 的时候要将其 name 由默认的"image[name][]"成"image[name]",即把后面的中括号去掉,因为 jQuery file upload 会默认将文件一个个上传而不是一次提交所有的文件,要不改的话 Carrierwave 会报错的,所以就很自然的用 simple_form 这么做了
<%= f.input :name, :label => "Upload image", :input_html => { :multiple => true, :name => "image[name]" }, as: :file %>
但是出来的结果却是
<div class="controls">
<input type="file" name="image[name][]" multiple="multiple" id="image_name" class="file optional">
</div>
name 属性没有变化,因为之前看 Railscast 里面用的是 f.file_field 来自定义的,所以就想当然的认为问题出在 simple_form 上面,然后就是各种 Google,结果当然是一无所获。最后终于则决定放弃 simple_form,直接使用 rails 带的 from builder 吧,然后才发现问题依旧,使用下面的代码依旧不能自定义 name 属性
<%= f.file_field :path, multiple: true, name: "image[name]" %>
后来使用"f.file_field override :name "这个关键字终于搜到了 github 上面的这个issue,敢情问题是出在 Rails 身上。
最后将 Rails 降到 3.2.12 之后问题就解决了。