2010-04-14 29 views
20

estoy leyendo estas dos páginas¿Cómo agregar una ruta RESTful personalizada a la aplicación Rails?

  1. resources
  2. Adding more RESTful actions

La página de Rieles Guías muestra

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

y su correspondiente URL

/photos/upload 

Esto se ve maravilloso.


Mis routes.rb muestra esta

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

Cuando hago: [~/my_app]$ rake routes

que ver las dos nuevas rutas añaden

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

Nota la inclusión de /new! I no quiero eso. Solo quiero /users/signup y /users/register (como se describe en la Guía de Rutas de Rutas).

¿Algún ayuda?

Respuesta

61

Al exponer un controlador como un recurso, se añaden automáticamente siguientes acciones:

show 
index 
new 
create 
edit 
update 
destroy 

Estas acciones se pueden clasificar en dos grupos:

  • :member acciones

La URL para la acción de miembro tiene la identificación del recurso de destino. MI.g:

users/1/edit 
users/1 

que se pueda imaginar :member acción como un método de instancia en una clase. Siempre se aplica en un recurso existente.

acciones miembro predeterminado: show, edit, update, destroy

  • :collection acciones

En el URL de la acción :collection no contiene el identificador del recurso de destino. Por ejemplo:

users/login 
users/register 

que se pueda imaginar :collection acción como un método estático en una clase.

acciones de cobro por defecto: index, new, create

En su caso se necesitan dos nuevas acciones para el registro. Estas acciones pertenecen a: tipo de recopilación (ya que no tiene el id. Del usuario al enviar estas acciones). La ruta puede ser el siguiente:

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

La dirección URL de las acciones son las siguientes:

users/signup 
users/register 

Si desea eliminar una acción estándar generada por los carriles usar: excepto /: únicas opciones:

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

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

Editar 1

lo general t Repita la acción confirmation como una acción :member. En este caso, params[id] contendrá el código de confirmación.

configuración Ruta:

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

URL

/users/xab3454a/confirm 

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

Controller

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 
+0

@KandadaBoggu, esta explicación se ve genial. Como seguimiento para verificar mi comprensión, digamos que quería enviar un enlace de "confirmación de la cuenta" en el correo electrónico de bienvenida del usuario. Ese enlace contendría un hash de validación de 8 caracteres. ¿Añadiría 'map.resources: users,: member => {: validate =>: get}'? ¿Cómo se conecta el 'hash' param? –

+0

Actualicé mi respuesta, eche un vistazo. –

+0

¿Qué significa que 'confirm_user_path' use' @ user.confirmation_code' en lugar del comodín ': id' en lugar de' @ user.foo' o '@ user.bar'? ¿Debería ser 'confirm_user_path (: id => @ user.confirmation_code)'? –

1

La opción new le permite crear nuevas rutas para crear objetos nuevos. Es por eso que están prefijados con ese término.

Lo que estás buscando es la opción :collection.

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

que creará las /users/signup y /users/register URLs.

+0

Tuve problemas para entender para qué se usaba 'collection'. La ruta ** es ** para crear nuevos objetos; los visitantes que se registran crean un nuevo objeto 'Usuario'. Entonces, ¿por qué no querría usar 'new'? ¿Es esto un error tipográfico en la Guía de Rails? –

3

Si entiendo bien su pregunta, solo quiere cambiar el nombre de las URL de las acciones new y create.

Esto se haría así:

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

Si realmente quisiera añadir nuevas rutas con las acciones del controlador correspondiente, a continuación, Damiens respuesta es el camino a seguir.

+0

@mikezter, definitivamente todavía necesito las rutas 'new' y' create'. Sin embargo, esto responde a las preguntas sobre * cambiar el nombre * de las rutas que tuve en el pasado. Gracias :) –

12

Esto puede ser tomado como jus t otra sintaxis, algo bueno saber que puede ser.

Sintaxis 1:

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

Rake ruta de salida incluirá

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

rs "}

Sintaxis 2: Si usted tiene sólo una ruta de recolección

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

Me gusta la sintaxis 2, nice awnser – Francois

Cuestiones relacionadas