当前位置:  开发笔记 > 后端 > 正文

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

如何解决《向现有控制器添加操作(RubyonRails)》经验,为你挑选了4个好方法。

我是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.



1> David..:

你所犯的错误其实很常见.

基本上,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

无论如何,希望有所帮助.


我认为在尝试理解路径在RoR中如何工作时最有帮助的事情之一就是要记住它们是从上到下进行评估的.因此,通常最佳做法是在一般(全能)路线之前拥有更具体的路线.

2> Nailson Land..:

在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'

它解决了我的问题.



3> zenazn..:

您的路由未设置为允许该路由.假设你使用的是默认的脚手架,把这个线之前map.resources :posts在配置/ routes.rb中线路:

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

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



4> 小智..:

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

在你的route.rb

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

这可能有所帮助

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有