为什么这个基本的Rails 3路由不起作用?

时间:2010-10-20 12:17:39

标签: ruby-on-rails ruby-on-rails-3 routes

我刚刚升级到Rails 3,并决定采用虚拟/沙盒应用程序进行旋转。奇怪的是,我似乎无法让任何路由起作用!

这是我的问题:

[cobychapple@shiva:Dev]$rails new TestApp
      create  
      create  README
      create  Rakefile
      ...
[cobychapple@shiva:Dev]$cd TestApp/
[cobychapple@shiva:TestApp]$rails g scaffold widget name:text
      invoke  active_record
      create    db/migrate/20101020115518_create_widgets.rb
      create    app/models/widget.rb
      ...
[cobychapple@shiva:TestApp]$rake db:migrate
(in /Users/cobychapple/Dev/TestApp)
==  CreateWidgets: migrating ==================================================
-- create_table(:widgets)
   -> 0.0015s
==  CreateWidgets: migrated (0.0016s) =========================================

[cobychapple@shiva:TestApp]$rake routes
(in /Users/cobychapple/Dev/TestApp)
    widgets GET    /widgets(.:format)          {:action=>"index", :controller=>"widgets"}
    widgets POST   /widgets(.:format)          {:action=>"create", :controller=>"widgets"}
 new_widget GET    /widgets/new(.:format)      {:action=>"new", :controller=>"widgets"}
edit_widget GET    /widgets/:id/edit(.:format) {:action=>"edit", :controller=>"widgets"}
     widget GET    /widgets/:id(.:format)      {:action=>"show", :controller=>"widgets"}
     widget PUT    /widgets/:id(.:format)      {:action=>"update", :controller=>"widgets"}
     widget DELETE /widgets/:id(.:format)      {:action=>"destroy", :controller=>"widgets"}

[cobychapple@shiva:TestApp]$rails s -d
=> Booting WEBrick
=> Rails 3.0.1 application starting in development on http://0.0.0.0:3000
[cobychapple@shiva:TestApp]$

所以现在我转到我的浏览器并访问http://localhost:3000/widgets

Rails说: 路由错误:没有路由匹配“/ widgets”

我不知道rake路由如何显示路由存在,然后服务器将不匹配它。我搜索了一大堆,似乎有一些人在rails 3中遇到了路由问题,但是没有一个像我得到的那样基本上是基本的。我确信我一路上都错过了一些小事,但我不能为我的生活弄清楚!有什么建议吗?

我的routes.rb文件只是脚手架生成的文件+文档注释:

TestApp::Application.routes.draw do
  resources :widgets

  # The priority is based upon order of creation:
  # skip the rest of the comments...
end

4 个答案:

答案 0 :(得分:3)

修改路由后需要重启服务器。 正如你在答案中所说的那样,你已经用-d选项启动了服务器,所以它进入了后台,然后你又尝试再次运行 - 但是第一个仍在运行。你应该杀了第一台服务器。

你提到的后台流程,不是任何流氓程序,它是你的第一台服务器。

答案是: 1)在开发过程中不要使用'-d'选项启动服务器(因此以后更容易重启或终止) 2)更改路由文件(或config / initializers中的任何文件)后,始终重新启动服务器

答案 1 :(得分:0)

我做了完全相同的事情,它对我有用。我唯一不同的是使用mysql数据库。 为什么不删除应用程序并重新执行。我无法想象你错过了什么。

这些是我的步骤:

rails new TestApp -d mysql
cd TestApp/
rails g scaffold widget name:text 
rake db:create
rake db:migrate
rake routes
(in /home/gjp/work/TestApp)
    widgets GET    /widgets(.:format)          {:controller=>"widgets", :action=>"index"}
    widgets POST   /widgets(.:format)          {:controller=>"widgets", :action=>"create"}
 new_widget GET    /widgets/new(.:format)      {:controller=>"widgets", :action=>"new"}
edit_widget GET    /widgets/:id/edit(.:format) {:controller=>"widgets", :action=>"edit"}
     widget GET    /widgets/:id(.:format)      {:controller=>"widgets", :action=>"show"}
     widget PUT    /widgets/:id(.:format)      {:controller=>"widgets", :action=>"update"}
     widget DELETE /widgets/:id(.:format)      {:controller=>"widgets", :action=>"destroy"}
rails s

然后http://localhost:3000/widgets工作。

答案 2 :(得分:0)

所以看来我已经解决了问题(但我仍然没有得到它!):

我正在做的是使用-d(分离模式)运行服务器脚本,它会直接返回控制台。我尝试在没有-d选项的情况下运行服务器,看看服务器活动日志的结果是什么,当我以这种方式运行服务器脚本时,它直接崩溃说端口已经在使用(即使运行detatched它没有'崩溃?!?!?)。

重新启动。一切正常,服务器脚本在任一模式下都可以正常运行。

所以我想一定有一些后台端口绑定问题,重启时擦除干净。如果将来发生在其他任何人身上,我的猜测是你可能有一些流氓进程(MAMP bug?来自另一个rails应用程序的流氓mongrel服务器?)绑定到某个地方的主机端口。检查一下,如果你找不到任何重新启动的东西,看它是否修复它。

耸肩

感谢您输入的人和/或女孩。

答案 3 :(得分:0)

在正确运行的开发环境中,没有必要重新启动服务器以重新加载路由。

忽略这一点 - 因为你在分离模式下启动了第二次服务器尝试,你没有看到它收到的绑定错误。

在前台运行服务器通常更容易,因此您可以看到任何错误。

如果确实收到了绑定错误,则可以对其进行跟踪:

sudo netstat -an | grep LISTEN | grep 3000

ps aux | grep -i rails