Rails 3 - пользовательское действие ajax не работает - PullRequest
0 голосов
/ 07 ноября 2011

Я хочу создать пользовательское действие в Rails, которое будет обновлять представления и выводить некоторую информацию о div.

Я использую этот камень для загрузки файла: https://github.com/valums/file-uploader/blob/master/client/fileuploader.js

После успешной загрузки яЯ хочу обновить с помощью ajax-страницы, сколько миллисекунд требуется.

В старых Rails я написал бы это с помощью:

def set_tab
  @diff = count_miliseconds_method
  render :update do |page|
    page.replace_html "place_menu", render( :partial => 'place_menu')
  end
end

Но я не могу понять, как это сделать в Rails 3.1.

Мой код контроллера пользовательских действий:

def custom
  [...] # Here everything works OK
  start_time = Time.now
  Some_method
  end_time = Time.now
  @diff = ((end_time - start_time)*100).to_i # counted miliseconds
  respond_to do |format|
    format.json {render :json => {:success => true, :time => @diff}, :status => :created, :location => custom_words_path}
  end
end

Мой код custom.js.erb

var el = $('#upload-log');
el.append("#{@diff} ms");

К сожалению, это не работает.Я получаю ответ, например {"success":true, "time":324}, но файл js.erb не выполняется, и страница не содержит информацию о миллисекундах.

Есть идеи, как это исправить?

Обновление

Github репо: https://github.com/there-is-no-spoon/Anagram

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Чтобы выполнить файл js.erb, вы должны передать

:format => :js

в ваш метод генерации пути - например:

link_to "My custom action", my_action_path(:format => :js)
1 голос
/ 07 ноября 2011

Теперь вы возвращаете JSON (в Rails 3.1), а не кусок строки, содержащей Javascript (как было раньше).

Вам нужно написать свой код, который обрабатывает ваш результат, где вы делаете AjaxВызов.Я предполагаю, что вы используете JQuery.Поэтому, когда вы делаете Ajax-вызов, реализуете обработчик успеха и выполняете там

var el = $("#upload-log"); 
...

.

По сути, сервер больше не возвращает Javascript, он полностью на стороне клиента.

Вам необходимо реализовать метод onComplete вашего плагина загрузки файлов.Прочтите руководство по вашему плагину js, оно четко упомянуто.

...