2010-11-07 283 views
1

更新的代碼Rails3中路由錯誤在底部阿賈克斯

我創建一個故事表決通過應用Rails的簡單的2本書。我得到這個錯誤,當我按一下按鈕投了一個故事:

No route matches "/stories/4-pure-css-icons-showcase"

我的路由文件看起來是這樣的:

Shovell::Application.routes.draw do 
    get "votes/create" 

    root :to => "stories#index" 
    resources :stories do 
    resources :votes 
    end 
end 

votes_controller.rb:

class VotesController < ApplicationController 
    def create 
    @story = Story.find(params[:story_id]) 
    @story.votes.create 
    end 

end 

create.rsj:

page.replace_html 'vote_score', "Score: #{@story.votes.size}" 
page[:vote_score].visual_effect :highlight 

show.html.erb:

<h2> 
    <span id="vote_score"> 
     Score: <%= @story.votes.size %> 
    </span> 
    <%= @story.name %> 
</h2> 
<p> 
    <%= link_to @story.link, @story.link %> 
</p> 
<div id="vote_form"> 
    <%= form_tag :url => story_votes_path(@story), :remote => true do %> 
     <%= submit_tag 'shove it' %> 
    <% end %> 
</div> 

story.rb:

class Story < ActiveRecord::Base 
    validates_presence_of :name, :link 
    has_many :votes 
    def to_param 
     "#{id}-#{name.gsub(/\W/, '-').downcase}" 
    end 
end 

我已經通過一些其他錯誤的工作在這之前有做不推薦使用的代碼等等,等等我現在感覺有些失落。它似乎應該只是一個路由問題,但由於我一直在處理AJAX錯誤,這也與投票功能有關,所以我想發佈這些文件,以防萬一它不僅僅是路由。

它說沒有路由匹配"/stories/4-pure-css-icons-showcase"但是當我訪問"/stories"(我的根),然後單擊鏈接帶我去"/stories/4-pure-css-icons-showcase"它工作正常,但是點擊投票按鈕,我得到這個錯誤後。正如您在閱讀完代碼後可能知道的那樣,假設更新投票計數並通過ajax執行:highlight


UPDATE:

改變的代碼(所有的改變都是每山姆的建議):

路線:

Shovell::Application.routes.draw do 
    resources :votes 
    root :to => "stories#index" 
    resources :stories do 
    resources :votes 
    end 

show.html.erb:

<div id="vote_form"> 
    <%= form_tag :url => new_story_vote_path(@story), :remote => true do %> 
     <%= submit_tag 'shove it' %> 
    <% end %> 
</div> 

votes_controller.rb

class VotesController < ApplicationController 
    def create 
    @story = Story.find(params[:story_id]) 
    @story.votes.create 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

的問題仍然是完全一樣的,但我認爲(讀:希望如此),我們都在進步!

場景:我的指數(/stories)頁面隨機顯示此頁它的數據庫,當你點擊它把你的鏈接故事的內部頁面(前/stories/2-sitepoint-forums)一個故事顯示的票數這個故事有一個按鈕可以爲它投票。當您點擊投票按鈕時,它會使用ajax更新@story.vote.size並使用:highlight視覺效果。然而,問題是,當你點擊投票按鈕的頁面變爲「路由錯誤」網頁,其中顯示:

No route matches "/stories/2-sitepoint-forums"

其怪我,因爲你其實可以路由到該地址和你從第一頁上的鏈接...


下面是在控制檯上的錯誤:

Started POST "/stories/2-sitepoint-forums?url=%2Fstories%2F2-sitepoint-forums%2F 
votes%2F2-sitepoint-forums&remote=true" for 127.0.0.1 at 2010-11-08 16:30:17 -08 
00 

ActionController::RoutingError (No route matches "/stories/2-sitepoint-forums"): 



Rendered C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0.rc2/lib/action_dis 
patch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0m 
s) 

林不知道這是否更具說服力,但我想我會添加它incase。


新: 我一直沒能解決這個問題的呢。因爲我仍然不覺得自己完全理解了這個問題,所以我決定轉到在線Ruby on Rails 3教程,看看在解決這個問題時我是否無法弄清楚。因爲我打算接下來要做的事情(我計劃稍後將兩個應用程序結合起來),現在看來是時候了。

+0

可以重述正是問題低於你更新後的代碼是什麼? – s84 2010-11-07 23:20:35

+0

與場景的描述和詳細的問題 – tehaaron 2010-11-08 00:02:02

回答

2
<%= form_tag :url => new_story_vote_path(@story), :remote => true do %> 
    <%= submit_tag 'shove it' %> 
<% end %> 

這應該發送給創建操作。

def create 
    @story = Story.find(params[:story_id]) 
    @story.votes.create 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

這應該照顧你的ajax。


藉此get "votes/create"出你的路線

,並添加此

map.resources :votes 
+0

更新它應該是create_story_vote_path?除此之外,看起來不錯。我想,這裏最初的問題是發佈到GET URL。 – 2010-11-07 22:05:27

+0

我仍然收到相同的錯誤。我完全按照Sam的說法以及Paul評論的內容進行了嘗試。此外,我改變了「投票」到「投票」,只是爲了確保它沒有幫助。一個問題,但我沒有format.html或format.js我應該? – tehaaron 2010-11-07 22:12:51

+0

'「的地圖。」'在Rails3中被改變,所以我做了相當的'資源:votes',現在我有一個新的錯誤,生病更新主哨吧。 – tehaaron 2010-11-07 22:43:24

0

我不熟悉使用的form_tag和:遠程(我通常只是寫的jQuery像這樣的東西)但是有一些事情肯定會在我身上彈出,你在這裏做的事情可能會幫助你解決問題。

首先,我認爲您可以重新設定您設置投票的方式,從而設置投票表格的方式。在故事的控制器,爲展會的行動,我會成立了投票的時候了:

@vote = Vote.new(:story_id => @story.id) 

這可讓您設置形式,所以:

= form_for(@vote), :remote => true do |f| 
    = hidden_field f.story_id 
    = submit_tag "Vote" 

這既是一個更清潔的方式在我看來,也可能會解決您正在處理的一般問題,因爲您現在將傳遞數據與您的POST請求中的表單(隱藏字段)。如果您執行實際上未提交數據的AJAX POST請求,Rails將表現異常。

換句話說,你原來的形式很可能運行作爲一個AJAX POST請求,但它會更好地工作作爲一個AJAX的GET請求,因爲它實際上沒有提交數據,這只不過是「打」的URL。

+0

不應該通過'POST'(和'DELETE/PUT',如果它是一個選項!)而不是' GET'? – Zabba 2010-11-08 02:35:46

+0

當我說「更好地工作」時,我的意思是,它實際上是從技術角度來看,而不是一定應該這樣做。他發送了一個GET請求,但創建了一個POST的表單,這可能是最初的根本問題。請注意,我建議的解決方案是一個POST請求,這是從資源的角度來看它應該如何完成的。 – adriandz 2010-11-08 02:52:56

+0

我是編程新手,因爲這是我嘗試學習的第一門語言。我不完全理解你對GET和POST等的看法,但明天我會花更多的時間來理解它。我更擔心現在編寫最佳實踐的方法,而不是簡單地將其運用到工作中。 – tehaaron 2010-11-08 06:39:02

0

我不確定你是否找到了你的問題的答案,但我想爲其他人發佈可能正在尋找類似於你的答案。

代碼:

<%= form_tag :url => new_story_vote_path(@story), :remote => true do %> 
    <%= submit_tag 'shove it' %> 
<% end %> 

將導致/故事/:POST請求:與story_id /票/新的URL。它不會工作,因爲new路由是一個:get方法請求。如果你想去new方法,你需要告訴表單使用get http方法。

<%= form_tag :url => new_story_vote_path(@story), :remote => true, :html => { :method => :get } do %> 
    <%= submit_tag 'shove it' %> 
<% end %> 

但是,我認爲你想要在你的控制器中路由到create方法。我會做這樣的事情:

<%= form_tag :url => story_votes_path(@story), :remote => true do %> 
    <%= submit_tag 'shove it' %> 
<% end %> 

這應該正確地路由到您的VotesController的create方法。