如下面看到的那樣,我在Rails 3.1應用程序試圖使用塊用的link_to爲POST:導軌3發出AJAX POST之後是GET到同一URL
視圖/壁/ _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>
視圖/壁/ 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涉及下列控制器動作:
個控制器/ completed_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完全相同的網址。
日誌
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 causes an immediate GET to the same URL但這使用jquery_ujs,我不相信,我已經離開了任何自定義的jQuery代碼圍坐。因此,我無法執行在添加「返回錯誤」的問題中提出的解決方案。
我懷疑,問題是在三個位置之一:
- 我有不正確的語法使用的link_to元素與塊
- 我的控制器內請求的處理是不正確
- 我在某種程度上增加了一倍我jquery_ujs(我真的不認爲是真實的,但它可能是在這裏)
編輯
縮小問題#1:
我改變了我的腳本如下,
<script>
$('.wall_problem').live('ajax:beforeSend', function() {
return false;
});
</script>
,發現了POST現在沒經過,但GET一樣,確認問題似乎是AJAX處理程序正在拾取鏈接並正確提交它作爲POST,但不攔截瀏覽器提交的GET。
縮小問題#2:
我起初並不提到它,但我使用jQuery移動。現在,在將腳本標記恢復到之前的形式,然後禁用jquery-mobile,我再次嘗試鏈接,它現在不提交GET但提交POST。這讓我相信,jquery-ujs和jquery mobile如何與鏈接交互存在一些問題。
請問一個問題,有很多completed_problems?或者,問題是否已完成或未完成?如果是後者,我只是在Post表中有一個布爾值來表示它是否已完成。然後,您可以對problems_controller更新操作進行簡單的AJAX調用,並將完成的屬性設置爲true或false。我不確定這是否是您的應用程序的構建方式,但如果是這樣,我會發布有關如何解決該問題的答案。 –
CompletedProblem對象實際上是用戶和問題之間的連接對象,所以我認爲這不會有幫助。這樣做似乎也只是爲了解決更大的問題。 – IanWhalen
如果用戶has_many有問題並且某個用戶的問題屬於某個用戶,則不需要加入。用一個簡單的布爾字段,你可以像'user.problems.where(:completed => false)'做範圍。這不是解決方法。更簡單的代碼=>更少的問題。此外,您可以編寫自己的Jquery函數來處理AJAX POST,然後在響應中使用.js.erb模板更新您的視圖 –