如何将自定义RESTful路由添加到Rails应用程序?

我正在读这两页

  1. resources
  2. Adding more RESTful actions

Rails指南页面显示

 map.resources :photos, :new => { :upload => :post } 

及其相应的URL

 /photos/upload 

这看起来很精彩。


我的routes.rb显示了这一点

 map.resources :users, :new => { :signup => :get, :register => :post } 

当我这样做: [~/my_app]$ rake routes

我看到添加了两条新路线

  signup_new_user GET /users/new/signup(.:format) register_new_user POST /users/new/register(.:format) 

注意包含/new ! 我希望这样。 我只想要/users/signup/users/register (如Rails Routing Guide中所述)。

有帮助吗?

将控制器公开为资源时,会自动添加以下操作:

 show index new create edit update destroy 

这些操作可以分为两组:

  • :member行动

成员操作的URL具有目标资源的id。 例如:

 users/1/edit users/1 

您可以将:member action视为类的实例方法。 它始终适用于现有资源。

默认成员操作: showeditupdatedestroy

  • :collection行动

:collection操作的URL不包含目标资源的id。 例如:

 users/login users/register 

您可以将:collection操作视为类的静态方法。

默认集合操作: indexnewcreate

在您的情况下,您需要两个新的注册操作。 这些操作属于:集合类型(因为您在提交这些操作时没有用户的ID)。 您的路线如下:

 map.resources :users, :collection => { :signup => :get, :register => :post } 

操作的URL如下:

 users/signup users/register 

如果要删除Rails生成的标准操作,请使用:except /:only options:

 map.resources :foo, :only => :show map.resources :foo, :except => [:destroy, :show] 

编辑1

我通常将confirmation操作视为:member操作。 在这种情况下, params[id]将包含确认码。

路线配置:

 map.resources :users, :member => { :confirm => :get} 

url

 /users/xab3454a/confirm confirm_user_path(:id => @user.confirmation_code) # returns the URL above 

调节器

 class UsersController < ApplicationController def confirm # assuming you have an attribute called `confirmation_code` in `users` table # and you have added a uniq index on the column!! if User.find_by_confirmation_code(params[id]) # success else # error end end end 

这可以作为另一种语法 – 有些可能很有用。

语法1:

 resources :users do member do get 'signup' post 'register' end end 

Rake Route输出将包括

 signup_users GET /users/signup(.:format) {:action=>"signup", :controller=>"users"} register_users POST /users/register(.:format) {:action=>"register", :controller=>"use 

RS“}

语法2:如果只有一个收集路由

 resources :users do get 'signup', :on => :collection end 

如果我正确理解你的问题,你只需要重命名new的url并create动作。

这将是这样做的:

 map.resources :users, :path_names => {:new => 'signup', :create => 'register'} 

如果你真的想添加具有相应控制器动作的新路线,那么Damiens的答案就是要走的路。

new选项允许您创建用于创建新对象的新路径。 这就是为什么他们以该术语为前缀。

您正在寻找的是:collection选项。

 map.resources :users, :collection => { :signup => :get, :register => :post } 

这将创建/users/signup/users/registerurl。