2010-04-14 7 views
20

lese ich diese beiden SeitenWie füge ich eine benutzerdefinierte RESTful-Route zu einer Rails-App hinzu?

  1. resources
  2. Adding more RESTful actions

Die Rails Guides Seite zeigt

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

und die entsprechende URL

/photos/upload 

Das sieht wunderbar aus.


Meine routes.rb zeigt diese

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

Wenn ich tun: [~/my_app]$ rake routes

Ich sehe die beiden neuen Routen

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

Hinweis die Aufnahme von /new hinzugefügt! I nicht wollen, dass. Ich möchte nur /users/signup und /users/register (wie in der Rails Routing Guide beschrieben).

Irgendwelche Hilfe?

Antwort

61

Wenn Sie einen Controller als Ressource aussetzen, werden folgende Aktionen automatisch hinzugefügt:

show 
index 
new 
create 
edit 
update 
destroy 

Diese Aktionen in zwei Gruppen kategorisiert werden können:

  • :member Aktionen

Die URL für die Mitgliedsaktion hat die ID der Zielressource. E.g:

users/1/edit 
users/1 

können Sie denken an :member Aktion als eine Instanz Methode für eine Klasse. Es gilt immer für eine vorhandene Ressource.

Standard Mitglied Aktionen: show, edit, update, destroy

  • :collection Aktionen

Die URL für die :collection Aktion nicht die ID der Zielressource enthalten. Z. B:

users/login 
users/register 

können Sie denken an :collection Aktion als statische Methode für eine Klasse.

Standard Sammlung Aktionen: index, new, create

In Ihrem Fall müssen Sie zwei neue Aktionen für die Registrierung. Diese Aktionen gehören zu: Sammlungsart (da Sie beim Senden dieser Aktionen nicht die ID des Benutzers haben). Ihr Weg kann wie folgt sein:

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

Die URL für die Aktionen sind wie folgt:

users/signup 
users/register 

Wenn Sie eine Standard-Aktion von Rails erzeugt entfernen verwenden: Ausnahme /: nur Optionen:

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

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

bearbeiten 1

ich in der Regel t reat die confirmation Aktion als :member Aktion. In diesem Fall enthält params[id] den Bestätigungscode.

Strecke Konfiguration:

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, diese Erklärung sieht gut aus. Als Follow-up, um nach meinem Verständnis zu suchen, sage ich, dass ich in der Willkommens-E-Mail des Benutzers einen Link "Konto-Bestätigung" senden möchte. Diese Verbindung würde einen achtstelligen Validierungshash enthalten. Würde ich 'map.resources: users,: member => {: validate =>: get}' hinzufügen? Wie wird der Hash-Parameter eingebunden? –

+0

Aktualisiert meine Antwort, werfen Sie einen Blick. –

+0

Was sagt 'confirm_user_path',' 'user.confirmation_code' 'anstelle des': id' Platzhalters anstelle von '@ user.foo' oder' @ user.bar' zu verwenden? Sollte dies 'confirm_user_path (: id => @ user.confirmation_code)' sein? –

1

Mit der Option new können Sie neue Routen zum Erstellen neuer Objekte erstellen. Deshalb haben sie diesen Begriff vorangestellt.

Was Sie suchen, ist die :collection Option.

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

, die die /users/signup und /users/register Urls schaffen.

+0

Ich hatte Schwierigkeiten zu verstehen, wofür 'collection' gedacht war. Die Route ** ist ** zum Erstellen neuer Objekte; Besucher, die sich anmelden, erstellen ein neues "Benutzer" -Objekt. Also, warum sollte ich nicht "neu" verwenden? Ist das ein Tippfehler im Rails Guide? –

3

Wenn ich Ihre Frage richtig verstehe, möchten Sie nur die URLs der new und create Aktionen umbenennen.

würde dies wie so geschehen:

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

Wenn Sie wirklich neue Routen mit entsprechenden Controller-Aktionen hinzufügen möchte, dann ist Damiens Antwort der Weg zu gehen.

+0

@mikezter, ich brauche definitiv noch die Routen 'new' und' create'. Dies beantwortet jedoch meine Frage nach * umbenennen * Routen, die ich in der Vergangenheit hatte. Danke :) –

12

Dies kann als jus genommen werden t eine andere Syntax - etwas, das gut zu wissen ist, kann sein.

Syntax 1:

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

Rake Strecke Ausgabe

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

rs "}

Syntax 2 enthalten wird: Wenn Sie nur eine Sammelroute

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

Ich mag die Syntax 2, nette Awnser – Francois

Verwandte Themen