我是Ruby on Rails的新手,我已经完成了博客教程.
我现在正在尝试向控制器添加一个名为"start"的附加操作.
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.为什么启动操作没有执行,是否存在我缺少的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
是的我已经重新启动了服务器并尝试使用Mongrel和webrick.
你所犯的错误其实很常见.
基本上,Rails会自动为您的脚手架映射URL.因此,当您创建Posts脚手架时,Rails会为其绘制URL路由.一条这样的路线是查看单个帖子的URL:/ posts /(post_id)
所以,当你输入URL /职位/启动Rails的认为你是在说:"嘿,给我一份有ID后=启动,所以Rails的抱怨显示方法无法找到这样的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
无论如何,希望有所帮助.
在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'
它解决了我的问题.
您的路由未设置为允许该路由.假设你使用的是默认的脚手架,把这个线之前的map.resources :posts
在配置/ routes.rb中线路:
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
正则表达式:action
将其限制为az(以避免捕获/ posts/1之类的内容).如果您在新操作中需要下划线或数字,则可以进行改进.
如果您使用的是rails 3.0.3,请尝试此操作
在你的route.rb
resource :posts do collection do get 'start' end end
这可能有所帮助