代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  36
  • Mark  · 技术社区  · 16 年前

    我是RubyonRails新手,我已经完成了 Blog Tutorial

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

    def start
    end
    

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

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

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

    下面是我的帖子。\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
    

    是的,我已重新启动服务器,并与Mongrel和webrick一起尝试。

    7 回复  |  直到 10 年前
        1
  •  45
  •   David    16 年前

    你犯的错误其实是很常见的。

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

    不管怎样,希望这有帮助。

        2
  •  33
  •   Nailson Landim    9 年前

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

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

    而不是

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

        3
  •  26
  •   zenazn    16 年前

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

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

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

        4
  •  8
  •   Darren    12 年前

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

    在你的路线上.rb

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

    这可能会有帮助

        5
  •  2
  •   hayesgm    13 年前

    我想说的是,有时候Rails会因为路由缓存而变得粘乎乎的,即使是在 环境

    这可能有助于 重新启动Rails服务器 . 在收到此错误时,这对我的影响比我能计算的次数还要多。

        6
  •  1
  •   iblue    12 年前

    这项工作:

    map.resource :post, :collection => { :my_action => :get}
    
        7
  •  0
  •   Thiago Diniz    15 年前

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

    map.resource :post
    

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