Я погружаюсь в Rails3 / JQuery / ненавязчивый javascript. Я написал игрушечное приложение, которое делает все, что я хочу, с отключенным JS, теперь я хочу представить javascript, чтобы серверу не приходилось обновлять всю страницу при каждой транзакции.
Вот среда NON-JS Controller / View для создания новой игрушки:
Контроллер
class ToysController < ApplicationController
...
def new
@toys = Toy.all
@toy = Toy.new
respond_to do |format|
format.html # new.html.erb
end
end
вид
# ==========
# file: views/toys/index.html.erb
<%= render :partial => 'list', :locals => {:toys => @toys, :target => nil} %>
<%= link_to 'New Toy', new_toy_path, :class => 'new' %>
# ==========
# file: views/toys/new.html.erb
<%= render :partial => 'list', :locals => {:dj_monitors => @toys, :target => @toy} %>
# ==========
# file: views/toys/_list.html.erb
<div class='table-div'>
<div class='body-div'>
<% toys.each do |t| %>
<%= render :partial => 'toy', :locals => {:toy => t} %>
<% end %>
<% if target && target.new_record? %>
<%= render :partial => 'form', :locals => {:toy => target} %>
<% end %>
</div>
</div>
(Прошу прощения за кажущуюся сложность, но все, что делает _list.html.erb, перечисляет все существующие игрушки, а если: target ссылается на новую запись, визуализирует частичную _form в конце списка.)
# ==========
# file: views/toys/_form.html.erb
<%= form_for(toy) do |f| %>
<div class='column selected'><%= f.number_field :sku %></div>
<div class='column selected'><%= f.text_field :description %></div>
<div class='column selected'>
<%= link_to 'Cancel', toys_path %>
<%= f.submit %>
</div>
<% end %>
ajaxification
В версии с поддержкой javascript мне бы хотелось, чтобы при нажатии на ссылку «новая игрушка» (в index.html.erb) отправлялся XMLHttpRequest, который возвращает только частичную форму , которая будет оказана на месте. Публикация этой формы также будет стандартной удаленной => истинной транзакцией.
Но я не могу понять, как заставить сервер возвращать только форму. Я изменил новый метод ToysController для:
def new
@toys = Toy.all
@toy = Toy.new
respond_to do |format|
format.html # new.html.erb
format.js { render :partial => 'form', :locals => {:toy => @toy} }
end
end
... и включил опцию: remote => true в ссылке [Новая игрушка] в представлении index.html.erb:
<%= link_to 'New Toy', new_toy_path, :class => 'new', :remote => true %>
Теперь мой прокси-сервер веб-отладки видит GET /toys/new HTTP/1.1
с X-Requested-With: XMLHttpRequest
(это выглядит правильно), но ответ HTTP/1.1 304 Not Modified
Почему он не отображает _form.html.erb?
обновление: избегать ответов "304 Not Modified" (не)
Было две проблемы - @Robin решил основную проблему. Другая часть заключалась в том, что я получал ответ «304 Not Modified» - он был технически правильным, поскольку сервер уже отправил форму, - но затруднил отладку.
Так что, если вы пытаетесь отлаживать код javascript / ajax, это может помочь удержать вызов 'expires_now' в вашем контроллере, чтобы заставить сервер повторно отправлять страницу во время отладки, например так:
def new
@toy = Toy.new
expires_now
respond_to do |format|
format.html ...
format.js ....
end
end