将Devise与资源相结合:Rails中的用户

我正在尝试使用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动作。

我的问题是:正在改变像这样的代码顺序正确的方式来设计与用户资源一起工作? 还是有更深层次的错误? 我怀疑只是交换这两行代码不能解决问题!

我在这些情况下的建议是检查rake routes在路由中,路由定义的顺序很重要,因为早期路由优先。

所以在您的情况下resources :users, :only => [:index, :show]创建了一个restfull /users/:id(.:format)路由,指向{:action=>"show", :controller=>"users"}当你去Devise的注册url/users/sign-up它认为’注册’是:id用户的:id并且自然无法找到它。

现在,如果您首先进行设计路由设置,则设计路径优先于稍后指定的任何路径,并且您将获得预期的行为。

是的,这是正确的方法(参见https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface )

在David Sulc编写的链接中显示您应该为device_for资源编写前缀示例:

 devise_for :users, :path_prefix => 'my' resources :users 

或者您的用户

 devise_for :users scope "/admin" do resources :users end 

两者都适合我