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

时间:2011-02-19 14:57:31

标签: ruby-on-rails devise

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

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

3 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:16)

答案 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

两者都适合我