2014-10-12 1 views
2

Мы работаем с Rails 3.2.19 и Ruby 2.1.2.Правильно ли указывать «: html => {: multipart => true}» для form_for?

У нас есть наследие строки кода (на самом деле, больше, чем один, но эта линия представляет особый интерес), который читает

form_for [@commentable, @comment], :html => { :multipart => true, :class => "lightbox_form"} do |f|

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

Многие примеры в SO см указания параметров :multipart, но потом я вижу этот ответ на Form_for with :multipart => true spits out, а затем в глядя на документы в http://guides.rubyonrails.org/v3.2.19/form_helpers.html#uploading-files, я вижу, что это не должно быть необходимым (за исключением случаев использования form_tag). Я также вижу эту дискуссию в https://github.com/rails/rails/issues/10176, что добавляет к моей путанице.

Я прошу отчасти, потому что мы получаем ошибки EOF в стойке (нет содержимого, поступающего на многопараграфный парсер, см. Rack throwing EOFError (bad content body), если вас интересуют эти детали).

Возможно, наш код ранее был запущен в ранних версиях Rails, если это было необходимо (и, возможно, это просто перерыв). Но, учитывая все остальные примеры SO, которые включают :multipart, я хочу лучше понять, нужно ли :multipart с form_for, прежде чем я удалю его и какие побочные эффекты могут возникнуть.

ответ

7

Это не требуется в Rails 3.1 и позже, до тех пор, пока вы используете form_for с file_field, как это:

<%= form_for @person do |f| %> 
    <%= f.file_field :picture %> 
<% end %> 

Это не будет работать:

<%= form_for @person do |f| %> 
    <%= file_field_tag 'person[picture]' %> 
<% end %> 

Вы можете легко проверить, что работает. Осмотрите сгенерированный HTML и найдите атрибут enctype="multipart/form-data" в теге формы. Rails не делает никакой магии, кроме установки типа кодировки, поэтому, если атрибут есть, вы хороши.

+0

Благодарим за ответ. Итак, кажется, что добавление ': multipart' просто постороннее для' form_for' (с учетом условия, которое вы дали). Или он действительно меняет поведение, чтобы включить его, если он не нужен другим (например, форсировать multipart, если он в противном случае не может быть использован)? – rdnewman

+0

В том числе, он будет устанавливать форму для многократного всегда, даже если это не нужно. Оставляя это, атрибут будет установлен только в том случае, если 'form_builder.file_field' запускает многопроцессорный режим. – elektronaut

Смежные вопросы