2008-12-30 111 views
36

我是Ruby on Rails的新手,我已經完成了Blog Tutorial添加一個動作到現有的控制器(Ruby on Rails)

我現在正試圖向控制器添加一個額外的動作,稱爲「開始」。

def start 
end 

我添加了一個視圖頁「應用程序/視圖/職位/ start.html.erb」不含任何添加劑的,但簡單的HTML。

當我去/ posts/start我得到以下錯誤。

ActiveRecord::RecordNotFound in PostsController#show 
Couldn't find Post with ID=start 

我明白錯誤,顯示操作正在執行,並且啓動不是有效的ID。爲什麼不執行啓動操作,是否存在我缺少的MVC體系結構或配置的某些部分?

下面是我posts_controller.rb

class PostsController < ApplicationController 

    # GET /posts/start 
    def start 
    end 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.find(:all) 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 
    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

end 

是的,我已經重新啓動服務器,並與雜種和使用WEBrick嘗試。

+0

請重新登錄...「開」不應該是標籤 – andHapp 2008-12-31 02:40:17

回答

26

您的路由沒有設置爲允許該路由。您使用的是默認的腳手架假設,把此行map.resources :posts線的config/routes.rb中:

map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i 

:action正則表達式限制它只是AZ(以防傳染之類的東西/職位/ 1)。如果您在新操作中需要下劃線或數字,則可以進行改進。

45

你所犯的錯誤實際上是一個很常見的錯誤。

基本上,Rails會自動映射腳手架的URL。所以當你創建Posts腳手架時,Rails會爲它映射URL路由。一個這樣的路線是查看單個帖子的URL:/ posts /(post_id)

所以,當你輸入URL/posts/start時,Rails認爲你在說「嗨,給我帶ID的帖子= start。所以Rails抱怨show方法找不到這樣的ID的帖子

解決這個問題的一個快速方法是確保你的config/routes.rb在腳手架之前有啓動動作的路由路線:

# Route for start action 
map.connect '/posts/start', :controller => 'posts', :action => 'start' 
# Default mapping of routes for the scaffold 
map.resources :posts 

不管怎樣,希望幫助

+1

感謝您的解釋,我將不得不閱讀更多的路線。 – Mark 2008-12-30 20:25:45

+4

我認爲在試圖理解路線如何在RoR中工作時最有幫助的事情之一是記住他們從上到下進行評估。因此,在普通(全部通過)路線之前制定更具體的路線通常是最佳做法。 – David 2009-01-04 12:40:48

+0

我用匹配'/頁/行動',:控制器=>'網頁',:行動=>'行動',它的工作。 – 2013-01-12 08:56:05

0

我foun。 d解決我的問題,在

map.resource :post 

我加入收藏論點的routes.rb文件,因此它留這樣:

map.resource :post, :collection => { :my_action => :get} 
1

這工作:

map.resource :post, :collection => { :my_action => :get} 
8

如果您在路線中使用導軌3.0.3

,請嘗試此操作。RB

resource :posts do 
    collection do 
    get 'start' 
    end 
end 

這可能幫助

2

我想說,有時候Rails的變粘帶的路線緩存,即使在發展環境。

它可能有助於重新啓動您的Rails服務器。在接收到這個錯誤時,這對我來說比我能算的更多。

33

On Rails的4.x的使用:

get '/posts/start', :controller => 'posts', :action => 'start' 

On Rails的3.x的使用:的

match '/posts/start', :controller => 'posts', :action => 'start' 

代替

map.connect '/posts/start', :controller => 'posts', :action => 'start' 

它解決了我的問題。

相關問題