有没有更好的方法来定义这些路线?

时间:2014-11-11 23:04:35

标签: ruby-on-rails ruby url-routing

我正在努力在我的Rails应用中支持用户。用户甚至不需要意识到还有其他用户。我不想只使用resources :users,因为生成的路由是:

      users GET    /users                    users#index
            POST   /users                    users#create
   new_user GET    /users/new                users#new
  edit_user GET    /users/:id/edit           users#edit
       user GET    /users/:id                users#show
            PATCH  /users/:id                users#update
            PUT    /users/:id                users#update
            DELETE /users/:id                users#destroy
删除了

(.:format)以提高可读性。

您必须将用户ID号放在URL中,这样用户才有机会了解其他用户的存在。我想要这些路线:

      users GET    /users                    users#index
            POST   /users                    users#create
   new_user GET    /users/new                users#new
  edit_user GET    /users/me/edit            users#edit
       user GET    /users/me                 users#show
            PATCH  /users/me                 users#update
            PUT    /users/me                 users#update
            DELETE /users/me                 users#destroy

是。 /users/me是您的用户的路径,这是您可以获得的唯一用户路径。

但问题在于定义这些路线。这是一个想法:

resources :users, constraints: { id: 'me' }

User模型中:

def to_param
  'me'
end

但这对我来说似乎过于愚蠢。有更好的想法吗?

1 个答案:

答案 0 :(得分:3)

使用Singular Resources你很高兴; - )

定义您的路线:

# config/routes.rb
resources :users, only: [:index, :create, :new]
resource :user, path: '/users/me', only: [:show, :edit, :update, :destroy]

如果您离开/user选项,您的路线将是单数(path:)。玩弄选项; - )

您的rake routes结果应如下所示:

   Prefix Verb   URI Pattern              Controller#Action
    users GET    /users(.:format)         users#index
          POST   /users(.:format)         users#create
 new_user GET    /users/new(.:format)     users#new
edit_user GET    /users/me/edit(.:format) users#edit
     user GET    /users/me(.:format)      users#show
          PATCH  /users/me(.:format)      users#update
          PUT    /users/me(.:format)      users#update
          DELETE /users/me(.:format)      users#destroy

您还可以在Rails控制台(rails c

上测试路线
2.1.3 :001 >  Rails.application.routes.url_helpers.user_path
 => "/users/me" 

2.1.3 :002 >  Rails.application.routes.url_helpers.edit_user_path
=> "/users/me/edit" 


如果您愿意,可以在Singular Resources上复数:user,但不要忘记设置as:选项,例如:

# config/routes.rb
resources :users, only: [:index, :create, :new]
resource :users, path: '/users/me', as: 'user', only: [:show, :edit, :update, :destroy]


请查看Rails指南中的注释和警告!这是一段摘录:

  

长期存在的错误会阻止form_for自动使用单一资源。 ...