2011-12-11 24 views
0

如下面看到的那樣,我在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代碼圍坐。因此,我無法執行在添加「返回錯誤」的問題中提出的解決方案。

我懷疑,問題是在三個位置之一:

  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移動。現在,在將腳本標記恢復到之前的形式,然後禁用jquery-mobile,我再次嘗試鏈接,它現在不提交GET但提交POST。這讓我相信,jquery-ujs和jquery mobile如何與鏈接交互存在一些問題。

+0

請問一個問題,有很多completed_problems?或者,問題是否已完成或未完成?如果是後者,我只是在Post表中有一個布爾值來表示它是否已完成。然後,您可以對problems_controller更新操作進行簡單的AJAX調用,並將完成的屬性設置爲true或false。我不確定這是否是您的應用程序的構建方式,但如果是這樣,我會發布有關如何解決該問題的答案。 –

+0

CompletedProblem對象實際上是用戶和問題之間的連接對象,所以我認爲這不會有幫助。這樣做似乎也只是爲了解決更大的問題。 – IanWhalen

+0

如果用戶has_many有問題並且某個用戶的問題屬於某個用戶,則不需要加入。用一個簡單的布爾字段,你可以像'user.problems.where(:completed => false)'做範圍。這不是解決方法。更簡單的代碼=>更少的問題。此外,您可以編寫自己的Jquery函數來處理AJAX POST,然後在響應中使用.js.erb模板更新您的視圖 –

回答

0

基於我在上述編輯中包含的信息,我繼續沿着測試Jquery Mobile的路徑並能夠解決。

首先,我更新到Jquery Mobile v1.0,它增加了linkBindingEnabled全局配置(http:// jquerymobile。COM /演示/ 1.0 /文檔/ API/globalconfig.html):

第二,我設置配置爲False:

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