Ruby on Rails 4:使用用户控制器设计,无法找到具有 'id'=sign_up 的用户

Ruby on Rails 4: Devise with Users Controller, Couldn't find User with 'id'=sign_up

我收到此错误:Couldn't find User with 'id'=sign_up 当我尝试在我的 [=44= 中转到 localhost:3000/users/sign_up 时] 浏览器。

我生成了一个单独的用户控制器...

我这样做了:

rails g devise:controllers users
rails g controller Users show

我没有接触过devise生产的控制器。

在我创建的普通用户控制器中,我有这个:

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
end

在我的路线中:

devise_scope :user do
  get 'users/:id' => 'users#show', as: :user
end
devise_for :users

我的 rake routes 看起来像这样:

new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
                 user GET    /users/:id(.:format)           users#show

为什么我收到错误是有道理的,因为我的 URL 中的 :id 是 sign_up,我只是不知道我应该做什么来解决这个问题。

当然,在 localhost:3000/users/ 之后,它总是会给我一个错误,因为我在用户控制器 [=20] 中的 show 方法中的 id =]

您有一个单独的 users_controller,它不属于 devise,因此 devise_scope 在那里没有用。如果您需要使用任何设计控制器操作,那么 devise_scope 很有用。因此,只需将您的路线设置为:

devise_for :users
get 'users/:id' => 'users#show', as: :user

当我们有相似的路线时,路线的顺序很重要。在设计中,路由 sign_upsign_out 被定义为 /users/sign_up(.:format) 所以假设您访问 sign_up url 然后它会检查设计中的路由并找到在那里匹配。所以它会将您重定向到该路线。现在,如果您输入 /users/1,它将在设计路线中找到,但找不到匹配项,因此最终它将映射到您的路线,如果没有定义这样的路线,它将抛出错误..

很高兴这对您有所帮助。 :)