Rails 4中的Devise:用户显示路由不存在

3
我正在使用devise gem来处理所有注册和登录的事情。但是我也想添加用户个人资料到我的应用程序中,所以我生成了一个只有show动作的用户控制器。然后我在routes.rb文件中添加了get 'users/:id' => 'users#show'。实际上,键入/users/1可以正常工作,但我找不到一种方法来命名路由。我想要的是得到类似show_user_path或user_path这样的东西,这样我就可以链接到特定用户的内容并显示该用户的个人资料。
这是我的routes.rb:
Pinteresting::Application.routes.draw do
  resources :pins
  get 'users/:id' => 'users#show'
  devise_for :users 

  root "pins#index"
  get "about" => "pages#about"

以下是我使用它得到的路由(我突出显示了我期望类似show_user_path的路由):

pins_path                        GET     /pins(.:format)     pins#index
                                 POST    /pins(.:format)     pins#create
new_pin_path                     GET     /pins/new(.:format)     pins#new
edit_pin_path                    GET     /pins/:id/edit(.:format)    pins#edit
pin_path                         GET     /pins/:id(.:format)     pins#show
                                 PATCH   /pins/:id(.:format)     pins#update
                                 PUT     /pins/:id(.:format)     pins#update
                                 DELETE  /pins/:id(.:format)     pins#destroy
#this is the one I want a path!  GET     /users/:id(.:format)    users#show
new_user_session_path        GET     /users/sign_in(.:format)    devise/sessions#new
user_session_path                        POST    /users/sign_in(.:format)    devise/sessions#create
destroy_user_session_path        DELETE  /users/sign_out(.:format)   devise/sessions#destroy
user_password_path               POST    /users/password(.:format)   devise/passwords#create
new_user_password_path       GET     /users/password/new(.:format)       devise/passwords#new
edit_user_password_path      GET     /users/password/edit(.:format)      devise/passwords#edit
                                 PATCH   /users/password(.:format)   devise/passwords#update
                                 PUT     /users/password(.:format)   devise/passwords#update
cancel_user_registration_path    GET     /users/cancel(.:format)     devise/registrations#cancel
user_registration_path       POST    /users(.:format)    devise/registrations#create
new_user_registration_path       GET     /users/sign_up(.:format)    devise/registrations#new
edit_user_registration_path      GET     /users/edit(.:format)   devise/registrations#edit
                                 PATCH   /users(.:format)    devise/registrations#update
                                 PUT     /users(.:format)    devise/registrations#update
                                 DELETE  /users(.:format)    devise/registrations#destroy
root_path                        GET     /   pins#index
about_path                       GET     /about(.:format)    pages#about
3个回答

6
对于devise而言,User并不是资源,它只是一个作用域。devise关心的是认证。
尽管路径被嵌套在/user下面,但你会注意到定义的资源实际上是诸如sessions、registrations、passwords等实体。
只需在你的路由中添加resources :users,并创建一个UsersController(以及视图)。
如果你不想为用户创建所有资源,只想使用get 'users/:id'时能够使用user_path(user),你可以使用as选项来命名该路由,就像这样:
get 'users/:id' => 'users#show', as: user

做得好!非常感谢。 - sergio.s

1
上面的答案很好,但我认为值得注意的是,如果您不想创建一个不同的控制器,而是想要向某个控制器(比如您从Devise :: RegistrationsController继承的控制器)中添加操作,则需要使用devise scope block
devise_scope :user do
  get 'users/:id' => 'registrations#show', as: user
end

0

答案应该是这样的:

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

它与上面接受的答案有何不同? - Vasfed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接