Обратные вызовы Ajax в Rails 3 с прототипом, а не с jQuery - PullRequest
3 голосов
/ 22 марта 2011

Я обновляю приложение с Rails 2 до 3 и перерабатываю все удаленные функции для использования ненавязчивого Javascript.Я пытаюсь обработать обратные вызовы ajax в UJS.

Я нашел много ресурсов, которые показывают, как реализовать эти обратные вызовы с помощью jQuery, но не так много для прототипа.Возможно, вы можете помочь мне понять это.

В Rails 2 у меня было это:

<% remote_form_for @foo, {:loading => "loading_function()", :complete => "complete_function()" } do |f| %>
 ...
<% end %>

В Rails 3 у меня есть это:

<%= form_for @foo, :remote => true do |f| %>
 ....
<% end %>

Отчто я выяснил до сих пор (что может быть неправильно), мне нужно прикрепить мои старые функции загрузки / завершения к форме, чтобы они запускались функцией handleRemote в Rails.js.Я просто не знаю, как это сделать.

Опять же, я делаю это в Prototype.Так что ответы, специфичные для этой структуры, приветствуются.

Ответы [ 4 ]

5 голосов
/ 24 марта 2011

Ответ следующий:

<%= form_for @foo, :remote => true do |f| %>
 ...
<% end %>
...
<script type='text/javascript'>
  $('edit_foo').observe('ajax:before', loading_function());
  $('edit_foo').observe('ajax:complete complete_function());
</script>
0 голосов
/ 29 декабря 2011

Есть способ получить ответ от вызова Ajax.Request, если вы использовали remote_form_for с опцией: update.Поэтому вам, вероятно, не нужно менять его, чтобы использовать Ajax.Updater в качестве обходного пути.По сути, вы используете respone.memo.responseText, в вашем примере это будет примерно так:

$('new_obj').observe('ajax:complete', function(response){
  console.info(response.memo.responseText);
  // Probably you would use it like this:
  $('new_obj').update(response.memo.responseText);
});
0 голосов
/ 13 сентября 2011

Для людей с подобной проблемой может также помочь посмотреть исходный код для удаленных помощников в исходном коде Rails 2.3.x.

В моем случае я хотел выяснить, что делать с параметром ': update', например:

remote_form_for(@obj, :update => "new_obj", :before => "some js code") do |f|

Мне нужно было найти функциональность обновления в код удаленной_функции .


Что касается моей конкретной проблемы, похоже, что невозможно получить эквивалент :update с помощниками Rails 3 UJS. rails.js в Rails 3 упаковывает :remote => true запросы с Ajax.Request(...), тогда как функция :update в Rails 2 включает Ajax запросы с Ajax.Updater(...). Для людей, которые хотят заменить функцию :update в Rails 2, я вижу 2 варианта:

  • Переключитесь на jquery-rails, чтобы вы могли получить доступ к ответу на запрос Ajax с помощью следующего кода:

    $("#elem").bind("ajax:complete", function(et, e){
      $("#results").html(e.responseText);
    });
    
  • Напишите свой собственный код на основе прототипов, чтобы захватить форму и отправить ее через ajax, используя Ajax.Updater(...) вместо Ajax.Request. НЕ используйте :remote => true, так как это попытается использовать Ajax.Request.

Дополнительное примечание : я играл с объектом обратного вызова, предоставленным в событии ajax:complete

$('new_obj').observe('ajax:complete', function(request){
  console.info(request);
});

Объект request, по-видимому, нигде не содержит ответа. Это довольно массивно, поэтому я могу ошибаться. Хотелось бы надеяться, что это поможет кому-то еще, пытающемуся перейти с Rails 2 на 3.

0 голосов
/ 23 марта 2011

Попробуйте ссылку . Да, это JQuery, но JQuery и Prototype не отличаются тем, как все работает вместе. Вот фрагмент кода, который добавляет новую задачу прямо на страницу индекса и использует Prototype:

views/tasks/_newform.html.erb:
<%= form_for(@task, :remote => true) do |f| %>
  <div>
    <%= f.label 'Add a new task: ' %>
    <%= f.text_field :name %>
  </div>
  <div>
    <%= f.submit %>
  </div>
<% end %>

views/tasks/index.html.erb:
<div id='newform'>
  <%= render :partial => "newform", :locals => { :@task => Task.new } %>
</div>

views/tasks/create.js.rjs:
page.insert_html :after, 'tablehead', :partial => @task
page.replace_html 'newform',:partial => "newform", :locals => { :@task => Task.new }

Редактировать: вам нужно добавить "format.js" в наш метод создания контроллера задач

...