Ruby on rails 向现有控制器(Ruby on Rails)添加操作

Ruby on rails 向现有控制器(Ruby on Rails)添加操作,ruby-on-rails,ruby,rails-routing,Ruby On Rails,Ruby,Rails Routing,我是RubyonRails新手,我已经完成了测试 我现在正在尝试向控制器添加一个附加操作,称为“开始” def start end 我添加了一个视图页面“app/views/posts/start.html.erb”,其中只包含简单的html 当我转到/posts/start时,我得到以下错误 ActiveRecord::RecordNotFound in PostsController#show Couldn't find Post with ID=start 我理解错误,正在执行sho

我是RubyonRails新手,我已经完成了测试

我现在正在尝试向控制器添加一个附加操作,称为“开始”

def start
end
我添加了一个视图页面“app/views/posts/start.html.erb”,其中只包含简单的html

当我转到/posts/start时,我得到以下错误

ActiveRecord::RecordNotFound in PostsController#show 
Couldn't find Post with ID=start
我理解错误,正在执行show操作,并且start不是有效的ID。为什么不执行start操作,是否缺少MVC架构或配置的某些部分

下面是我的帖子。\u 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
class PostsController@posts}
结束
结束
#获取/posts/1
#GET/posts/1.xml
def秀
@post=post.find(参数[:id])
回应待办事项|格式|
format.html#show.html.erb
format.xml{render:xml=>@post}
结束
结束
结束

是的,我已重新启动服务器,并使用Mongrel和webrick进行了尝试。

您的路由设置不允许该路由。假设您使用的是默认脚手架,请将此行放在config/routes.rb中的
map.resources:posts
行之前:

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

:action
的正则表达式仅将其限制为a-z(以避免捕获/posts/1之类的内容)。如果您在新操作中需要下划线或数字,则可以对其进行改进。

您所犯的错误实际上是一个非常常见的错误

基本上,Rails会自动映射脚手架的URL。因此,当您创建Posts框架时,Rails正在映射它的URL路由。其中一个路由是查看单个帖子的URL:/posts/(post\u 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

无论如何,希望这能有所帮助。

我在routes.rb文件中找到了问题的解决方案,其中

map.resource :post
我添加了collection参数,所以它保持这样:

map.resource :post, :collection => { :my_action => :get}
这项工作:

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

如果您使用的是rails 3.0.3,请尝试此操作

在你的路线上.rb

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

这可能会有所帮助,我想说的是,有时候Rails会因为路由缓存而变得粘乎乎的,即使在开发环境中也是如此

重新启动Rails服务器可能会有所帮助。
。在收到此错误时,这对我来说已经起到了无法计数的作用。

在Rails 4.x上使用:

get '/posts/start', :controller => 'posts', :action => 'start'
在Rails 3.x上使用:

match '/posts/start', :controller => 'posts', :action => 'start'
而不是

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

它解决了我的问题。

谢谢你的解释,我将不得不阅读更多关于路线的内容。我认为,在试图理解RoR中路线的工作原理时,最有帮助的一件事是记住它们是自上而下进行评估的。因此,通常最好的做法是在常规(综合)之前有更具体的路线路由。我使用了匹配'/pages/action',:controller=>'pages',:action=>'action',它起作用了。请在Rails 3中重新标记“…”on”不应该是标记,这会将
“collection”=>{“my_action”=>:get}
添加到get参数中。在Rails 3中,collection选项将
“collection”=>{“my_action”=>:get}
添加到get参数中。