Каковы лучшие практики Rails для шаблонов javascript в контроллерах restful / resourceful? - PullRequest
8 голосов
/ 15 июня 2010

Во-первых, 2 общих (базовых) подхода:

# returning from some FoosController method
respond_to do |format|
  # 1. render the out a json representation
  format.json { render :json => @foo }

  # 2. render an RJS template, say update.js.erb
  format.js { render }
end

# in update.js.erb
$('#foo').html("<%= escape_javascript(render(@foo)) %>")

Это, очевидно, простые случаи, но я хотел показать, о чем я говорю. Я полагаю, что это также случаи, ожидаемые ответчиком по умолчанию в рельсах 3 (либо шаблон по умолчанию с именем действия, либо вызов _ # {format} на ресурсе.)


Проблемы

С 1 вы получаете полную гибкость на стороне представления, не беспокоясь о шаблоне, но вы должны манипулировать DOM напрямую через javascript. Вы теряете доступ к помощникам, частичным лицам и т. Д.

С 2 у вас есть партиалы и помощники, но вы привязаны к одному шаблону (по крайней мере по умолчанию). Все ваши представления, которые делают вызовы JS в FoosController, используют один и тот же шаблон, который не совсем гибкий.


Три других подхода (ни один действительно удовлетворительный)

1.) Заранее избавьтесь от нужных мне частей / помощников в javascript, а затем вставьте их на страницу после, используя замену строк, чтобы адаптировать их к возвращаемым результатам (указав имя, идентификатор и т. Д.).

2.) Поместите логику представления в шаблоны. Например, поиск определенного элемента DOM и выполнение одного действия, если оно существует, и другого, если его нет.

3.) Поместите логику в контроллер для рендеринга различных шаблонов. Например, в полиморфном месте, где обновление может быть вызвано для comments / foo или posts / foo, рендеринг commnts / foos / update.js.erb вместо posts / foos / update.js.erb.


Я использовал все это (и, вероятно, другие, о которых я не думаю). Часто в одном приложении, что приводит к запутанному коду. Есть ли лучшие практики для такого рода вещей? Кажется, это достаточно распространенный сценарий использования, при котором вы хотите вызывать контроллеры с помощью действий Ajax из разных представлений и ожидать, что произойдут разные вещи (без необходимости выполнять утомительные вещи, такие как экранирование и замена строк и вспомогательные функции на стороне клиента).

Есть мысли?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2010

Лучше всего, чтобы ваш веб-интерфейс использовал RESTful API. То есть получать и размещать ресурсы в формате JSON с помощью JavaScript, работающего на клиенте, так же, как третье лицо может получать и размещать ресурсы в формате JSON с использованием RestClient. Это означает, что у вас нет шаблонов .rjs или .js.erb на сервере - вместо этого у вас могут быть шаблоны Mustache, Handlebars или jQuery, а также клейкий JavaScript, встроенный (или статически связанный с) из HTML-страницы, изначально доставленной на веб-клиент.

Конечно, быстрый и грязный подход к использованию remote => true, переходу на сервер и отрисовке шаблона кода JavaScript для создания JavaScript, который будет выполняться на клиенте ... проще. И это было довольно хорошей практикой некоторое время. Но нам нужен JavaScript для формата данных сейчас, и у нас сегодня есть превосходные возможности для извлечения данных в формате JSON и шаблонов рендеринга в клиенте.

0 голосов
/ 18 ноября 2010

Не уверен, что эта работа для вас, но я бы сделал следующее:

  1. Создание шаблонов .js с использованием ERB, эти шаблоны будут статичными
    1. Шаблонами могут быть усы, джем, шаблоны JQuery или что-то еще.
  2. Используйте задачу rake для генерации всех шаблонов и создания из них статических файлов .js.
  3. Включите эти статические файлы, используя их, они будут кэшироваться браузером.
  4. Заполните шаблоны данными json и включите сгенерированный html.

Предполагается, что шаблоны на самом деле могут быть статичными, что зависит от текущей ситуации. Но в целом это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...