form.submit () пропущен rails.js наблюдателем UJS - PullRequest
5 голосов
/ 04 марта 2010

В приложении на Rails 3 я хочу, чтобы браузер вызывал удаленную функцию всякий раз, когда установлен определенный флажок. В Rails 2 это было легко сделать, передав

:onclick => remote_function(...)

к помощнику флажка. В Rails 3 функции remote_ * устарели, поэтому я попробовал следующий обходной путь:

  • создать форму вокруг флажка, используя form_tag ... :remote => true
  • отправить форму по телефону $("dummy_form").submit(); из обработчика onclick

В файле rails.js, поставляемом в комплекте с Rails, находится наблюдатель, который прослушивает события submit. Однако, похоже, что они запускаются только тогда, когда пользователь нажимает кнопку отправки, но не при вызове form.submit() (пока проверено только в FF).

Это приводит к нежелательному эффекту, что отправка затем выполняется не в фоновом режиме через AJAX, а обычным способом, поэтому браузер покидает текущий сайт и отображает ответ от контроллера.

Кто-нибудь знает обходной путь? Может быть, совершенно другой способ получить ту же функциональность?

1 Ответ

1 голос
/ 06 октября 2010

Вы можете отправить форму по телефону:

$("dummy_form").request({
    onSuccess: function(response) {eval(response)}
});

Это отправит форму с использованием AJAX по URL-адресу, указанному для form_tag, и оценит полученный ответ, поэтому он должен ответить JS. Измените реализацию onSuccess, если вы этого не хотите.

Если отправка формы является обходным путем, как вы говорите, тогда вместо отправки всей формы вы также можете вручную обработать событие нажатия на флажок и отправить запрос AJAX :

<%= javascript_tag do %>
Event.observe(window, 'load', function() {
  $('CHECK_BOX_ID').observe('click', function(event) {
    new Ajax.Request('/your/url', {
      onSuccess: function(response) {
        // yada yada yada
      }
    })
  });
});
...