Rails 3.0 / 3.1, JQuery И Ajax Рекомендации


В этом посте есть несколько вопросов, связанных с названием. Общая тема сообщения может быть резюмирована следующим образом: "что я упускаю/как вы делаете это лучше?"

С помощью обычных методов Google / screencasts / API, я только что закончил изучение начинающего рабочего знания о том, как использовать Rails 3.0-JQuery-Ajax combo.

Я остался с некоторыми (возможно, значительными?) вопросы. В Railscast 242 Райан заканчивает выполнение окончательного обновления до страница, имеющая следующее:

$("#products").html("<%= escape_javascript(render("products")) %>");
Поначалу это казалось очень странным, и до сих пор кажется немного странным: индекс.JS.шаблон erb знает, что индекс.html-страница имеет div "# products " и индекс.JS.сам шаблон erb-это то, что выдает команду update? Мне кажется, что это небольшое нарушение разделения проблем - не должно ли JS на индексе.html-страница - это то, что фактически обновляет страницу с данными, которые она получает обратно из сообщения, в отличие от сценария от сервера, являющегося тем, что на самом деле обновляет страницу? Кроме того, это кажется немного хрупким. По какой-то глупой причине, если я переименую div в index.html, чтобы сказать: "#products_collection", и забыть изменить индекс.JS.Эрб, затем мой индекс.html-страница по-прежнему будет работать, но мое обновление Ajax не будет. я хотел бы знать, считаете ли вы вышеуказанные пункты допустимыми / что с ними делать, если они есть.

Если нужно, я могу объяснить эти вещи: Если вы думаете о действии индекса в целом, то это не так. большое дело этот индекс.js знает об индексе.формат html. Они могут быть тесно связаны, но они вроде как должны/могут быть. И Вы любой вид тестирования будет раскрыть div переименовать. хорошо. Но...

Теперь я подхожу к идее пойти дальше по кроличьей норе Ajax: предположим, что вы загружаете новую форму на страницу индекса через Ajax get, а затем отправляете ее через Ajax post. Следуя тому же шаблону, ваше творение.JS.erb файл может выглядеть примерно так это:

Создать.JS.Эрб?

$("#products").prepend("<%=escape_javascript( render 'product_as_table_row', :product => @product))%>");

Теперь мое действие create также знает, как выглядит моя страница индекса. Хм...теперь предположим, что мы также хотим сделать относительно стандартное поведение предоставления сообщения пользователю через flash:

Создать.JS.Эрб?

<% flash.each do |key, value| %>
  $("div#flash").html("<div class='<%=key%>'><%=value%></div>");
<% end %>
$('div#flash div').fadeOut(10000);

$("#products").prepend("<%=escape_javascript( render 'product_as_table_row', :product => @product))%>");

Теперь, в дополнение к тому, что мне кажется более тесной, чем мне бы хотелось, связью между index и create, у меня есть это большое обновление flash в моем шаблоне js. Я не вижу, как я могу абстрагироваться от этого - Можно я завернусь это превращается в метод? Куда мне его девать? Даже если это можно обернуть в метод, не каждый будет создавать.js и обновление.шаблон js должен вызвать эту функцию, и разве это не сухо? Является ли это целью наследования взглядов в 3.1? Вы утверждаете, что Ajax делает flash ненужным, так как пользователь теперь увидит свой продукт прямо на странице?

Как насчет неудачи творения? Это тоже бросается в творение.JS.Эрб?

Создать.JS.erb

<% if @thought.new_record? %>
  <%# ??? Throw in Validation-Error Form Updates? Display a Modal Dialog? %>
<% else %>
  $("#products").prepend("<%=escape_javascript( render 'product_as_table_row', :product => @product))%>");
<% end %>

В короче говоря, я научился выполнять запросы get и post, но я не вижу, как применить общий шаблон Ajax ко всему ресурсу сухо и правильно, или за его пределами, во всем моем приложении. То, с чем я столкнулся, кажется прекрасным для крошечных вещей, но не в целом. Ненавязчивый JS может быть хорош абстрактно, но в данный момент он кажется очень навязчивым в большей части моего приложения. Никогда не делал Ajax в Rails 2.икс, у меня там нет ничего, на что можно было бы опереться. Так.. Все это кажущееся неряшливость, как мне кажется, не может быть лучшим способом делать вещи. Чего мне не хватает? Любая проницательность оценена по достоинству.

2 5

2 ответа:

Я настоятельно рекомендую вам взглянуть на следующую статью одного из основных членов команды rails_ujs, включая все ссылки внизу: rails-2-remote-links-and-forms

Вы можете обернуть все это в функции и поместить их в приложение.js, чтобы ваши шаблоны выглядели как

update_product("<%= escape_javascript(render("products")) %>");

add_product("<%=escape_javascript(render 'product_as_table_row', :product => @product))%>");

etc..

То же самое касается обновления flash и обработки ошибок