Rails 3.0 / 3.1, JQuery & Ajax Best Practices - PullRequest
5 голосов
/ 18 июня 2011

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

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

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

$("#products").html("<%= escape_javascript(render("products")) %>");

Сначала это казалось очень странным, и все же кажется немного странным: шаблон index.js.erb знает, что на странице index.html есть div '#products', а шаблон index.js.erb сам то, что выдает команду обновления? Мне кажется, что это является небольшим нарушением разделения проблем - если JS на странице index.html не является тем, что фактически обновляет страницу данными, которые она получает обратно из поста, в отличие от сценария с сервера быть тем, что на самом деле обновляет страницу? Кроме того, это кажется слегка хрупким. По какой-то глупой причине, если я переименую div в index.html, чтобы сказать «#products_collection», и забуду изменить index.js.erb, то моя страница index.html все равно будет работать, но мое обновление Ajax не будет. Я хотел бы знать, если вы считаете, что вышеуказанные пункты верны / что с ними делать, если они есть.

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

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

create.js.erb

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

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

create.js.erb

<% 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 кажется мне ближе, чем у меня, у меня есть большое жирное обновление в моем шаблоне js. Я не вижу, как я могу абстрагироваться от этого - Могу ли я обернуть это в метод? Куда я это положу? Даже если он может быть заключен в метод, не будет ли каждый шаблон create.js и update.js вызывать эту функцию, и разве это не СУХОЙ? В этом ли цель наследования представлений в 3.1? Вы утверждаете, что Ajax делает ненужной вспышку, так как пользователь теперь увидит свой продукт прямо на странице?

А как насчет неудачи создания? Это также добавляется в create.js.erb?

create.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 ко всему ресурсу DRY-ly и правильно, или даже больше, во всем приложении. То, с чем я столкнулся, кажется хорошим для крошечных вещей, но не в целом. Ненавязчивый JS может быть хорош в абстрактном виде, но на данный момент он кажется очень навязчивым в большей части моего приложения. Я никогда не делал Ajax в Rails 2.x, и у меня нет ничего, на что можно было бы опираться. Итак ... Вся эта кажущаяся неряшливость кажется мне, что это не может быть The Rails Way, чтобы делать вещи. Что мне не хватает? Любое понимание приветствуется.

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

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

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

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

etc..

То же самое касается обновления флэш-памяти и обработки ошибок

1 голос
/ 16 марта 2012

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

...