Во-первых, 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 из разных представлений и ожидать, что произойдут разные вещи (без необходимости выполнять утомительные вещи, такие как экранирование и замена строк и вспомогательные функции на стороне клиента).
Есть мысли?