我正在尝试使用routes.rb文件中的以下代码将Devise与RESTful用户资源结合使用:
resources :users, :only => [:index, :show]
devise_for :users
然而,url localhost:3000 / users / sign_up没有进入设计注册页面,而是产生错误“无法找到具有ID = sign_up的用户”,因此它认为该url指向该节目用户控制器的动作。 我发现交换行的顺序会产生预期的行为:
devise_for :users
resources :users, :only => [:index, :show]
现在当你去localhost:3000 / users / sign_up时,你确实得到了注册页面,然后转到localhost:3000 / users / 1按照预期点击用户控制器的show动作。
我的问题是:正在改变这样的代码顺序正确的方式来设计与用户资源一起工作?还是有更深层次的错误?我怀疑只是交换这两行代码不能解决问题!
答案 0 :(得分:22)
我在这些情况下的建议是查看rake routes
在路线中,路线定义的顺序很重要,因为先前的路线优先。
因此,在您的情况下,resources :users, :only => [:index, :show]
创建了一条指向/users/:id(.:format)
的restfull {:action=>"show", :controller=>"users"}
路由
当你去Devise的注册网址/users/sign-up
时,它认为'注册'是用户的:id
,并且自然无法找到它。
现在,如果您首先进行设计路由设置,则设计路线优先于稍后指定的任何路线,并且您会得到预期的行为。
答案 1 :(得分:16)
是的,这是正确的方法(参见https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)
答案 2 :(得分:3)
在David Sulc编写的链接中显示您应该为device_for or resources写一个前缀 示例:
devise_for :users, :path_prefix => 'my'
resources :users
或您的用户
devise_for :users
scope "/admin" do
resources :users
end
两者都适合我