Как видно ниже, я нахожусь в приложении на 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»;
Я подозреваю, что проблема находится в одном из трех мест:
- У меня естьневерный синтаксис для использования элемента link_to с блоком
- Моя обработка запроса в контроллере неверна
- Я как-то удвоил свой 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 взаимодействуют со ссылкой.