У меня есть немного бита проблемы, заставляя Плагин Формы jQuery работать правильно с полем загрузки файла. Когда я использую плагин для представления формы без поля загрузки файла, format.json
часть respond_to do |format|
блок называют правильно. Однако путем добавления поля загрузки файла, это только выполняется format.html
часть, которая заставляет мой код JavaScript думать, что ошибка произошла.
Кто-либо столкнулся с этим прежде или знает способ вынудить плагин всегда использовать json? С другой стороны, я могу изменить URL что сменное использование, чтобы вынудить направляющие представить json?
Большое спасибо за любую справку! Код ниже:
# app/controllers/details_controller.rb
def create
@detail = Detail.new(params[:detail])
style = params[:detail_style].to_sym || :thumb
data = { :id => '5', :url => 'test.rails' }
respond_to do |format|
if @detail.save
flash[:notice] = 'Your image has been saved.'
data = { :id => @detail.id, :url => @detail.data.url(style) }
format.html { redirect_to :action => 'index' }
format.json { render :json => "", :status => :created }
else
format.html { render :action => 'new' }
format.json { render :json => @detail.errors, :status => :unprocessable_entity }
end
end
end
/* app/views/sidebar/_details.html.erb (excerpt) */
<% form_for(Detail.new, :html => { :multipart => true } ) do |f| %>
<%= hidden_field_tag 'detail_style', 'thumb' %>
<%= f.label :image, "Recent Images" %>
<%= f.file_field :image%>
<%= f.submit "Upload" %>
<% end %>
По-видимому, установка заголовка Accept невозможна, когда используется ajaxSubmit и загружается файл.
См. ответ malsup в этой теме здесь.
Он говорит:
Загрузка файлов не использует ajax, плагин формы только делает так. таким образом. При загрузке файла происходит настоящий браузерный сабмит.
Можете ли вы проверить сообщение на сервере с помощью firebug и вставить сюда заголовки запроса. Мы хотим убедиться, что заголовок Accept установлен на json. Кроме того, какую версию рельсов вы используете?
Я все еще не уверен, почему это не работает, но я перепробовал много вещей и наконец нашел решение.
Я попробовал изменить url, добавив .json
в конец, что заставило Rails отобразить блок format.json
, но это запутало мой браузер, заставив его думать, что я хочу загрузить файл.
Затем я попробовал изменить url, передав параметр ?format=json
, который, к сожалению, сделал то же самое.
В конце концов, я попробовал изменить format.json
на просто format.js
(Javascript) и добавить .js
в url, но все равно использовал тот же render :json => ...
, что и раньше, а также устанавливаю параметр dataType
в вызове jQuery на json
. Похоже, что это работает, хотя это и не самое оптимальное решение.
Я надеюсь, что кто-то еще найдет это полезным. Я напишу еще раз, если найду правильный ответ. А пока, если у кого-то еще есть правильный ответ, дайте мне знать, и я приму ваш!