我在rails应用程序中第一次使用devise(2.1.2)。我跟着w / install程序并生成了User模型。我的设置非常通用,我只有两个控制器。我昨天开始运行并进行身份验证,没有任何问题。我正在登录和退出并停止并重新启动我的服务器而没有问题。生活很美好。当我尝试访问/ main / index(protected)时重定向到用户/ sign_in这是有意义的,但是我得到了这个错误
没有路线匹配{:controller =>“devise / main”}
这是routes.rb
get "bid/index"
get "main/index"
get "main/feed"
get "main/admin"
get "main/fullday"
match "bid/bid/:id/:starttime/:endtime/:color" => "bid#bid"
match "bid/delete/:id" => "bid#delete"
match "main/bidfeed/:id" => "main#bidfeed"
match "main/attr/:id/:field/:value" => "main#attr"
devise_for :users
root :to => 'main#index'
我真的不明白“devise / main”来自哪里,我不明白为什么在我重新启动服务器后突然失败的原因:(
答案 0 :(得分:2)
当您在命名空间控制器内时(通常是Devise视图),通常会发生这种情况。
在导致错误的link_to
上,尝试在控制器名称上加上斜杠。
Check this issue on the Devise page on Github
为什么会发生这种情况:在您的routes.rb上,devise_for
方法实际上为您的“设计控制器”创建了一个命名空间。您创建的设计视图属于“设计控制器”,因此,当您在设计命名空间(不存在)和kaboom中使用link_to :controller => 'bla', Rails will try to find the controller
bla`时!
理想情况下,您应该使用基于资源的路由或命名路由。这样可以最大限度地减少这类问题,并且可以使代码更容易阅读和维护(嗯,通常就是这种情况,但这绝不是银弹 - 小心使用这个建议)。
如果您仍然很好奇,我建议您阅读guides page about routing(非常简单直接追逐)和documentation of url_for(如果您认真对待Rails,那么真的很有帮助。)< / p>