2008-12-30 112 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' 

它解决了我的问题。

相关问题