Rails 3 выдает ajax POST с последующим GET на тот же URL - PullRequest
0 голосов
/ 12 декабря 2011

Как видно ниже, я нахожусь в приложении на Rails 3.1, пытающемся POST с помощью link_to с использованием блока:

views / wall / _problem.html.erb

<li data-icon="check">
<%= link_to(
  url_for(
    :controller => 'completed_problems',
    :action => 'create',
    :problem_id => "#{problem.id}"),
  {:class => "wall_problem",
  :confirm => "Climbed it?",
  :remote => true,
  :"data-type" => "json",
  :method => "POST"}) do %>
<div>stuff</div>
<% end %>
</li>

views/wall/show.html.erb

<% content_for :content do %>
  <div data-role="content">
  <ul data-role="listview">
    <%= render :partial => 'problem', :collection => @wall.live_problems.sort %>
  </ul>
<% end %>

<script>
  $('.wall_problem').live('ajax:success', function() {
    alert("Success!");
  });
</script>

Этот конкретный POST направлен на следующее действие контроллера:

controllers / complete_problems_controller.rb

class CompletedProblemsController < ApplicationController
  # POST /completed_problems
  def create
    @problem = Problem.find(params[:problem_id]
    @completed_problem = @problem.completed_problems.build
    if @completed_problem.save
      render :json => { }
    else
      render :json => { :location => root_url}
    end
  end
end

Как выИз журналов видно, что POST завершается успешно, но по какой-то причине приложение выполняет GET с точно таким же URL-адресом одновременно.

LOGS

Started POST "/completed_problems?problem_id=11" for 127.0.0.1 at 2011-12-11 13:13:06 -0500
  Processing by CompletedProblemsController#create as JSON
  Parameters: {"problem_id"=>"11"}
  # SQL stuff snipped from here
Completed 200 OK in 116ms (Views: 3.0ms | ActiveRecord: 2.6ms)

Started GET "/completed_problems?problem_id=11" for 127.0.0.1 at 2011-12-11 13:13:06 -0500
  Processing by CompletedProblemsController#index as HTML
  Parameters: {"problem_id"=>"11"}
Rendered completed_problems/index.html.erb within layouts/application (29.6ms)
Completed 500 Internal Server Error in 36ms

Эта проблема звучит примерно так же, как и jQuery ajax POST вызывает немедленный GET для того же URL , но при этом используется jquery_ujs, и я не верю, что оставил какой-либо пользовательский код jquery без присмотра.Таким образом, я не могу выполнить решение, предложенное в этой проблеме, с добавлением «return false»;

Я подозреваю, что проблема находится в одном из трех мест:

  1. У меня естьневерный синтаксис для использования элемента link_to с блоком
  2. Моя обработка запроса в контроллере неверна
  3. Я как-то удвоил свой jquery_ujs (что я действительно не считаю верным,но это может быть здесь)

РЕДАКТИРОВАТЬ

Сузить проблему # 1:

Я изменил свойсценарий к следующему,

<script>
  $('.wall_problem').live('ajax:beforeSend', function() {
    return false;
  });
</script>

И обнаружил, что POST теперь не прошел, но GET сделал, подтверждая, что проблема, похоже, в том, что обработчик AJAX выбирает ссылку и представляет ее какPOST правильно, но не перехватывает GET, который отправляет браузер.

Сужение проблемы # 2:

Сначала я не упоминал об этом, но использую Jquery-mobile.Теперь, возвращая тег script к предыдущей форме и отключая jquery-mobile, я снова попробовал ссылку, и теперь она не отправляет GET, но отправляет POST.Это заставляет меня поверить, что есть некоторая проблема с тем, как jquery-ujs и jquery mobile взаимодействуют со ссылкой.

1 Ответ

0 голосов
/ 12 декабря 2011

Основываясь на информации, которую я включил в вышеуказанное редактирование, я продолжил идти по пути тестирования Jquery Mobile и смог решить.

Сначала я обновился до Jquery Mobile v1.0, в котором добавлена ​​ссылка LinkBindingEnabled.global config (http://jquerymobile.com/demos/1.0/docs/api/globalconfig.html):

Во-вторых, я установил эту конфигурацию в False:

$(document).bind("mobileinit", function(){
  $.mobile.linkBindingEnabled = false;
});
...