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

mač*_*ček 22 rest routing ruby-on-rails

我正在读这两页

  1. resources
  2. Adding more RESTful actions

Rails指南页面显示

map.resources :photos, :new => { :upload => :post }
Run Code Online (Sandbox Code Playgroud)

及其相应的URL

/photos/upload
Run Code Online (Sandbox Code Playgroud)

这看起来很精彩.


我的routes.rb节目就是这样

map.resources :users, :new => { :signup => :get, :register => :post }
Run Code Online (Sandbox Code Playgroud)

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

我看到添加了两条新路线

  signup_new_user GET    /users/new/signup(.:format)
register_new_user POST   /users/new/register(.:format)
Run Code Online (Sandbox Code Playgroud)

注意包含/new!我希望这样.我只是想/users/signup/users/register(如Rails路由指南中所述).

有帮助吗?

Har*_*tty 61

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

show
index
new
create
edit
update
destroy
Run Code Online (Sandbox Code Playgroud)

这些操作可以分为两组:

  • :member 行动

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

users/1/edit 
users/1
Run Code Online (Sandbox Code Playgroud)

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

默认成员的行为:show,edit,update,destroy

  • :collection 行动

操作的URL :collection不包含目标资源的ID.例如:

users/login
users/register
Run Code Online (Sandbox Code Playgroud)

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

默认动作集:index,new,create

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

map.resources :users, :collection => { :signup => :get, :register => :post }
Run Code Online (Sandbox Code Playgroud)

操作的URL如下:

users/signup
users/register
Run Code Online (Sandbox Code Playgroud)

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

map.resources :foo, :only => :show

map.resources :foo, :except => [:destroy, :show]
Run Code Online (Sandbox Code Playgroud)

编辑1

我通常将confirmation行动视为一种:member行为.在这种情况下params[id]将包含确认码.

路线配置:

map.resources :users, :member => { :confirm => :get}
Run Code Online (Sandbox Code Playgroud)

网址

/users/xab3454a/confirm

confirm_user_path(:id => @user.confirmation_code) # returns the URL above
Run Code Online (Sandbox Code Playgroud)

调节器

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
Run Code Online (Sandbox Code Playgroud)


pra*_*ari 12

这可以作为另一种语法 - 有些可以知道.

语法1:

resources :users do
  member do
    get 'signup'
    post 'register'
  end
end
Run Code Online (Sandbox Code Playgroud)

耙路输出将包括

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

RS"}

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

resources :users do
    get 'signup', :on => :collection
end
Run Code Online (Sandbox Code Playgroud)