Плагин jQuery Form + Ajax File Upload + Rails - PullRequest
3 голосов
/ 16 ноября 2009

Я использую jQuery Form Plugin в форме большой задницы, которая включает в себя некоторые поля файла. Серверная часть - это Ruby on Rails.

У меня проблемы с тем, чтобы Rails распознал тип запроса POST как 'text / javascript', хотя я считаю, что я его правильно устанавливаю.

Форма выглядит так:

<form id="listing_form" method="POST" enctype="multipart/form-data" action="/listings">
    <input type="text" size="30" name="listing[venue][phone]" id="listing_venue_phone"/>
    <input type="file" size="30" name="listing[venue][image]" id="listing_venue_image"/>
    ...plus tons of other fields

JS выглядит так:

$("#listing_form").ajaxForm({ dataType: 'script' });

И я также заявил:

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader('Accept', 'text/javascript')}
});

Запрос поступает к контроллеру, но блок Rails response_to видит его как обычный html-запрос. Кроме того, Firebug показывает ошибку синтаксического анализатора и не отображает заголовки запроса и ответа в консоли.

Если я удаляю поле файла и POST только текстовые поля, блок response_to обрабатывает запрос как js-запрос и правильно выполняет файл create.js.erb.

Как я могу заставить Rails правильно ответить на запрос? Благодаря.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Из-за ограничений безопасности JavaScript невозможно отправить формы с (не пустыми) полями файла через XHR. Обычный обходной путь заключается в том, чтобы «подделать» представление формы ajax, отправив сообщение на скрытый iframe. Я верю, что это также то, что делает плагин jQuery Form.

Один из способов заставить Rails обрабатывать эти «поддельные» представления формы ajax как фактические XHR запросы - добавить специальный параметр в beforeSubmit обратный вызов плагина jQuery Form:

// ...
beforeSubmit: function(data) {
    data.push({name: 'accept_js', value: '1'});
}
// ...

Затем в вашем контроллере используйте фильтр before для установки формата запроса на :js, когда публикуемые данные содержат специальный параметр:

before_filter :set_ajax_request

# ...

private
  def set_ajax_request
    request.format = :js if params[:accept_js] == '1'
  end

Ваш respond_to метод теперь должен работать как положено.

2 голосов
/ 05 ноября 2010

Если вы используете Rails 3, попробуйте гем Remotipart. Это делает загрузку файлов в стиле AJAX относительно безболезненной.

http://rubygems.org/gems/remotipart

http://github.com/leppert/remotipart

...