2013-09-21 57 views
0
爲POST

我建立一個Rails應用程序,讓用戶對問題和答案,這是嵌套投「無路由匹配」錯誤回答:Rails的嘗試時,通過AJAX

<%= link_to raw('<i class="icon-2x icon-chevron-up"></i>'), vote_question_answer_path(@question, answer, :type => :up), :method => :post %> 

但是這個代碼,它應該通過AJAX做同樣的事情:

<%= link_to raw('<i class="icon-2x icon-chevron-up"></i>'), vote_question_answer_path(@question, answer, :type => :up), :remote => true, :method => :post %> 

正確地記錄了投票,但隨後提供了以下錯誤:

ActionController::RoutingError at /questions/fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu/answers/6/vote=========================================================================================================================================================================> No route matches {:action=>"vote", :controller=>"answers", :type=>:up, :question_id=>nil, :id=>#<Answer id: 6, body: "Ullamco Pinterest food truck incididunt trust fund,...", user_id: 1, question_id: 10, created_at: "2013-09-10 22:20:40", updated_at: "2013-09-10 22:20:40">}app/views/shared/_vote_answer_arrows.html.erb, line 6 

我很困惑 - 是不是兩個發佈到相同的路線?爲什麼一個人工作,另一個人給出了路由錯誤?

我認爲這個問題與嵌套路由有關,因爲我對這些問題有幾乎相同的代碼,並且AJAX路由在那裏工作。

編輯:按照要求,這裏是相關線路:

resources :questions do 
    member { post :vote } 
    resources :answers do 
    member { post :vote } 
    end 
end 

而且respond_to代碼做|格式|

respond_to do |format| 
    format.html{ redirect_to :back, :flash => { :success => 'Thank you for voting!' }} 
    format.js {} 
end 

這裏是螢火蟲的AJAX錯誤信息/ URL:

"NetworkError: 500 Internal Server Error - http://localhost:3000/questions/fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu/answers/5/vote?type=down" 

這裏是AJAX PARAMS從螢火蟲(這看起來非常錯誤的我,所以我不知道這是否是源問題或只是我是不熟悉螢火蟲:

這裏是從服務器輸出成功的非Ajax請求的參數:

Parameters: {"authenticity_token"=>"X3Dg3TSZ8blMNTT1Zce2R0A1rtZI93ViFJNsjOP145w=", "type"=>"up", "question_id"=>"fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu", "id"=>"3"} 
+0

有趣的是,錯誤消息顯示'沒有路由匹配{...:question_id => nil,:id =>#<答案id:6,...} ...因爲1. question_id是零和2.因爲id是一個答案**對象**。你可以發佈你的routes.rb文件,一個成功的請求(當你不使用ajax時)參數在rails服務器輸出中,以及ajax請求的url和參數是什麼(來自firebug或chrome開發者工具)? – carols10cents

+0

感謝您的關注。我剛剛發佈了您請求的信息。特別是AJAX參數對我來說看起來是錯誤的。今天早上我剛開始使用螢火蟲,所以我可能會在錯誤的地方尋找這些參數。 – dmanaster

+0

我剛剛注意到,你說ajax請求「正確記錄投票,但是會給出以下錯誤:」所以這意味着ajax請求被正確路由並獲得您的控制器操作,並且路由錯誤正在發生在您的控制器操作被處理後發生。當這個請求完成後你做什麼?我發現你的respond_to塊中有'format.js {}';此請求完成後,您是否在JavaScript中執行任何操作?感謝您發佈額外的信息,這對處理一些事情非常有幫助。 – carols10cents

回答

1

正如我在上面的評論中提到的,這原來是一個簡單的控制器問題。

在我的控制器中,我沒有定義@question。直到我將請求轉換成ajax並且需要變量來渲染javascript中的部分時,這纔不成問題。

我加入

@question = Question.find(params[:question_id]) 

到控制器,並且它解決了這一問題。

-1

在您的控制器中,您是否有respond_to do |format|塊?

你應該有類似...

respond_to do |format| 
    if something_saves or whatever 
    format.html { redirect_to random_path, notice: 'Vote was casted.' } 
    format.json { render :json => { :voteCasted => true } } 
    else 
    format.html { render :nothing } 
    end 
end 

主線還有就是......

format.json { render :json => { :voteCasted => true } } 

目前,它聽起來就像你缺少響應JSON格式。這就是爲什麼HTML版本工作正常,AJAX(JSON)方法沒有。

+0

這與他收到的路由錯誤沒有任何關係。相反,它告訴控制器返回客戶端(html,json等)的內容,如果他無法首先進入控制器,這並不重要。 –

+0

感謝您的幫助。我確實有一個format.js行,它爲非嵌套資源(問題)工作。我將它添加到原始問題中。 – dmanaster

+0

對不起。謝謝你澄清。 – gbdev