Я пытаюсь отправить запрос ajax из тега формы, но запрос XHR не отправляется. Если я делаю то же самое по ссылке, все работает отлично.
Вот вид, из которого я могу отправить запрос по ссылке или из формы:
<div id="request_test">
<%= link_to "test", explorer_test_path(:format => :js), :remote => true %>
<%= form_tag explorer_test_path(:format => :js), :id => "testform", :remote => true, :method => :get do %>
<%= submit_tag "Send test request"%>
<% end %>
</div>
<div id="response_test"></div>
В моем контроллере я затем проверяю, является ли это запросом XHR или нет, и затем отображаю javascript, отвечающий на запрос ajax:
def test
if request.xhr?
logger.debug "xhr"
else
logger.debug "not xhr"
end
respond_to do |format|
format.js
end
end
Мой test.js.erb очень прост:
$("#response_test").html("<b>hi</b>");
В результате, если я нажимаю на ссылку, получаю искомое поведение, то есть, что div response_test читает «привет». Если я отправляю форму, я просто получаю javascript в test.js.erb, записанный в виде строки, и журнал сервера, сообщающий мне, что форма не отправила запрос XHR. Если я отлаживаю все это в firebug, я получаю тот же результат, ссылка отправляет запрос ajax, отправленная форма - нет. В обоих случаях моя консоль сообщает мне, что сервер обрабатывает запрос как JS, поэтому проблем с типом данных не должно быть.
Запуск Rails 3.0.4 с помощью jquery UJS.
Благодарю за любые подсказки о том, в чем может быть проблема, я пытался выяснить это уже довольно давно, но, поскольку я относительно новичок в Rails, я подозреваю, что мне не хватает чего-то простого.
ОБНОВЛЕНИЕ: добавление следующего javascript из (http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/)) устраняет проблему, из-за чего предполагается, что: remote => true в моем теге формы не найден или неправильно интерпретирован jjery ujs. Я вижу это как Обходной путь - это больше, чем постоянное исправление, поэтому, если кто-нибудь и поймет, что не так в моем исходном коде, я буду очень признателен.
$('#testform').live('submit', function(e) {
$.rails.handleRemote( $(this) );
e.preventDefault();
});