JQuery и Railssubmitting с заголовками AJAX и HTML

Этот немного уникален...

У меня есть серия изображений флажков, при нажатии на которые форма отправляется... с использованием следующего Javascript:

$('#pin_rose').simpleImageCheck({
  image: '/images/rose.png',
  imageChecked: '/images/one.png'
   })
  .change(function() {
    var c = 'checked';
    if (!$('#pin_rose').is(':checked')) {
      $(this).closest('form').submit();
    }
    $(this).closest('form').submit();

});

Однако я бы хотел, чтобы форма отправлялась с использованием ajax в среде rails 3, чтобы страница не перезагружалась...

В моем партиале _edit.html у меня есть следующее:

<%= form_for([@posts, @pin], :html => {:multipart => true}, :remote => true) do |f| %>

В моем контроллере pins_controller.rb у меня есть:

def update
...
    respond_to do |format|
      if @pin.update_attributes(params[:pin])
        format.html { redirect_to @post }
        format.js
      else
        format.html { redirect_to '/static_pages/login' }
        format.js
      end
...
end

Затем в моем update.js.erb у меня есть

$("#new_pins").append("<h1>new pin added</h1>")

Проблема в том, что когда я нажимаю на изображение, форма отправляется и данные добавляются, но она перенаправляется, а не использует ajax.

Есть ли способ заставить rails переопределить вызов $(this).closest('form').submit(); Javascript, чтобы он не отправлялся как html?

Я знаю, что мог бы сделать стандартный вызов ajax в Javascript, но предпочел бы этого не делать, так как мне нужно будет вытаскивать объекты в будущем («добавлен новый пин-код» только сейчас).

ОБНОВЛЕНИЕ: Запущены рейк-маршруты...

           users POST /users(.:format)                           users#create
        new_user GET  /users/new(.:format)                       users#new
            user GET  /users/:id(.:format)                       users#show
       post_pins POST /posts/:post_id/pins(.:format)             pins#create
    new_post_pin GET  /posts/:post_id/pins/new(.:format)         pins#new
   edit_post_pin GET  /posts/:post_id/pins/:id/edit(.:format)    pins#edit
        post_pin PUT  /posts/:post_id/pins/:id(.:format)         pins#update
           posts POST /posts(.:format)                           posts#create
        new_post GET  /posts/new(.:format)                       posts#new
       edit_post GET  /posts/:id/edit(.:format)                  posts#edit
            post GET  /posts/:id(.:format)                       posts#show
                 PUT  /posts/:id(.:format)                       posts#update
           login      /login(.:format)                           static_pages#login
           about      /about(.:format)                           static_pages#about
                      /posts(.:format)                           posts#new

ВТОРОЕ ОБНОВЛЕНИЕ

Основная проблема в том, что $('#myform').submit(); отправляется как html. Есть ли способ изменить это так, чтобы он вместо этого переходил на format.js? Я также пробовал это безрезультатно:

<%= f.check_box :rose, :onchange => '$(this.form).submit();' %> 

person user749798    schedule 28.05.2012    source источник


Ответы (1)


Я бы явно назвал форму, т.е.:

<%= form_for([@posts, @pin], 
   :remote => true, 
   :html => {:multipart => true, :id=>'myform'} ) do |f| %>

Затем в вашем javascript:

$('#myform').submit();
person RadBrad    schedule 28.05.2012
comment
Только что попробовал, и хотя данные вставляются в базу данных, страница все равно перенаправляется обратно на себя, а не выполняет команду update.js.erb. Любые другие предложения? Спасибо! - person user749798; 29.05.2012
comment
если я изменю объект redirect_to, то страница будет перенаправлена ​​туда, куда я попрошу... но format.js, похоже, игнорируется. я не могу понять почему - person user749798; 29.05.2012
comment
еще одна вещь... если я удалю все javascript и использую обычную форму отправки, тогда это сработает... так что, похоже, это связано с событием onchange... если изменить флажок на ‹%= f.check_box: rose, :onchange =› 'this.form.submit()' %›, тогда я получаю ту же проблему с перенаправлением. Есть ли способ передать событие onchange в js? - person user749798; 29.05.2012
comment
Запустите «рейк-маршруты» и опубликуйте результаты в редактировании исходного вопроса, т. е. «ОБНОВЛЕНИЕ: я пробежал грабли-маршруты и…». - person RadBrad; 29.05.2012
comment
Я думаю, что вы нажимаете свое действие создания, скопируйте блок response_to в свое действие создания. - person RadBrad; 29.05.2012