2011-05-18 92 views
5

我進入Rails和嘗試在博客設置從這裏添加一個「投票」功能:http://guides.rubyonrails.org/getting_started.htmlRuby on Rails的:行動的link_to,沒有路由匹配

在應用程序/控制器/ posts_controller.rb我創建這樣的:

def incvotes 
    @post = Post.find(params[:id]) 
    post.update_attributes(:upvotes => 1) 
    format.html { redirect_to(@post, :notice => 'Vote counted.') } 
    format.xml { head :ok } 
    end 

在應用程序/視圖/職位/ index.html.erb我創造了這個:

<%= link_to 'Vote', :controller => "posts", :action => "incvotes", :id => post.id %> 

但鏈接是給錯誤

No route matches {:controller=>"posts", :action=>"incvotes", :id=>1}

我在這裏錯過了一些東西,但不知道是什麼。

耙路線:

incvotes_post POST /posts/:id/incvotes(.:format) {:action=>"incvotes", :controller=>"posts"} 
     posts GET /posts(.:format)    {:action=>"index", :controller=>"posts"} 
       POST /posts(.:format)    {:action=>"create", :controller=>"posts"} 
    new_post GET /posts/new(.:format)   {:action=>"new", :controller=>"posts"} 
    edit_post GET /posts/:id/edit(.:format)  {:action=>"edit", :controller=>"posts"} 
     post GET /posts/:id(.:format)   {:action=>"show", :controller=>"posts"} 
       PUT /posts/:id(.:format)   {:action=>"update", :controller=>"posts"} 
       DELETE /posts/:id(.:format)   {:action=>"destroy", :controller=>"posts"} 
    home_index GET /home/index(.:format)   {:action=>"index", :controller=>"home"} 
     root  /(.:format)     {:action=>"index", :controller=>"home"} 
+0

什麼是你的路由文件說有關的職位? – sscirrus 2011-05-18 20:49:08

+0

資源:帖子 – Zeno 2011-05-18 20:55:09

回答

3

嘗試

= link_to "vote", incvotes_post_path(post), :method=>:post 

,如果還是不行,請嘗試更改方法:把

+0

用這個或放,都給出了錯誤:沒有路線匹配「/ posts/1/incvotes」 – Zeno 2011-05-18 22:39:57

+0

你可能在你的代碼中有一個錯字嗎?當它應該是'@ post.update_attributes'時,你有'post.update_attributes'。不知道這是否會導致這個問題。你可以發佈所有的索引視圖和控制器代碼嗎?你有github帳戶,你可以在其中發佈模型,控制器和索引視圖的代碼嗎?也許只是堅持它的愛情。對不起,有點不對勁 – stephenmurdoch 2011-05-18 22:46:42

+0

3個文件在這裏:http://pastie.org/1924217 – Zeno 2011-05-18 22:55:59

3

我的猜測是,你可能沒有一個定義你的路由文件爲你只是在控制器中定義的操作。必須爲Rails定義控制器中的動作和路由文件中的動作,以正確生成URL。

你的路由文件可能有這樣的事情:

resources :posts 

但是你想添加更多的不是由resources關鍵字生成的標準動作,所以嘗試這樣的事:

resources :posts do 
    member do 
    post 'incvotes' 
    end 
end 

這告訴路由,您的帖子控制器中有另一個動作,稱爲incvotes,只要它們使用正確的動作指向成員路由(/ posts/14是成員路由,而/ posts /是'collection '路線)。因此,您可能會有一條新路線,可能類似/posts/14/incvotes,您可以發佈表單並開始正常工作。

編輯:

其實我猜,因爲你是剛剛加入1對模型的屬性,你並不需要一個POST操作(這通常與發佈形式與createupdate相關)。要發送帖子,您可能需要更改視圖中的HTML以包含表單並將其發佈到正確的網址。所以你可以試試,或者你可以改變你的路線文件來讀取get 'incvotes'而不是post 'incvotes'。對於混淆抱歉,希望有所幫助!

+0

我的路由文件確實看起來像這樣,所以我改變它,現在的投票按鈕:沒有路由匹配「/ posts/1/incvotes」 – Zeno 2011-05-18 20:56:04

+1

你可以從命令行運行'rake routes'並添加輸出到你的問題? – 2011-05-18 21:21:28

+0

我編輯它爲我的第一篇文章格式的原因。 – Zeno 2011-05-18 21:41:28

1

incvotes_post路由只接受HTTP POST,並且鏈接始終生成HTTP GET。

改用一個按鈕的形式(或使用AJAX進行POST)。

+2

幾乎所有'link_to'文檔都聲明將':method'參數作爲URL選項傳遞給link_to,可以使用post方法動態創建HTML表單。所以你可以在技術上使用'link_to'來創建一個POST請求。 – 2011-05-18 23:27:14

0

嘗試使用button_to代替link_to

在你看來:

<%= button_to 'Vote', incvotes_post_path(post) %> 

在你的config/routes.rb添加路線t Øincvotes行動post

resources :posts do 
    member do 
    post 'incvotes' 
    end 
end 

而在你的控制器,創建incvotes行動:

def incvotes 
    # Something 
    redirect_to :posts 
end 
相關問題