Rails 3.0 / 3.1, JQuery & Ajax Best Practices

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

С помощью обычных методов поиска в Google / скринкастов / 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.js знает о index.html. Они могут быть тесно связаны, но они вроде как должны / могут быть. И вы при любом тестировании обнаружите переименование div. хорошо. Но ...

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

create.js.erb?

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

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

create.js.erb?

<% flash.each do |key, value| %>
  $("div#flash").html("
<%=value%>
"); <% end %> $('div#flash div').fadeOut(10000); $("#products").prepend("<%=escape_javascript( render 'product_as_table_row', :product => @product))%>");

Теперь, в дополнение к тому, что мне кажется более близким -тем-я бы хотел связать index и create, у меня есть это большое обновление fat flash в моем шаблоне js. Я не понимаю, как я могу абстрагироваться от этого - Могу я превратить это в метод? Куда мне его положить? Даже если его можно обернуть в метод, разве каждый шаблон create.js и update.js не должен вызывать эту функцию, и разве это не DRY? Это и есть цель наследования представлений в 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 %>

Короче говоря, я научился выполнять запросы на получение и публикацию, но я не вижу, как применить общий Шаблон Ajax для всего ресурса СУХОЙ и корректно,или помимо этого, во всем моем приложении. То, с чем я столкнулся, кажется подходящим для мелких вещей, но не в целом. Ненавязчивый JS может быть хорош абстрактно, но на данный момент он кажется очень навязчивым для большей части моего приложения. Так как я никогда не использовал Ajax в Rails 2.x, мне не на что опираться. Так что ... Вся эта кажущаяся небрежность кажется мне, как будто это не может быть The Rails Way. Что мне не хватает? Приветствуется любое понимание.

5
задан MissingHandle 18 June 2011 в 08:46
поделиться