2010-04-14 14 views
20

Czytam te dwie stronyJak dodać niestandardową trasę REST do aplikacji Rails?

  1. resources
  2. Adding more RESTful actions

Strona Rails Guides pokazuje

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

i jej odpowiedni adres URL

/photos/upload 

To wygląda cudownie.


Moi routes.rb pokazuje to

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

Kiedy zrobić: [~/my_app]$ rake routes

widzę dwie nowe trasy dodany

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

Uwaga włączenia /new! I Nie chcę, żeby to było. Chcę tylko /users/signup i /users/register (zgodnie z opisem w Poradniku routingu Rails).

Każda pomoc?

Odpowiedz

61

Kiedy wystawiać kontrolera jako zasób, następujące działania są automatycznie dodawane:

show 
index 
new 
create 
edit 
update 
destroy 

Działania te można podzielić na dwie grupy:

  • :member działań

Adres URL akcji członka ma identyfikator zasobu docelowego. MI.g:

users/1/edit 
users/1 

Można myśleć o :member działania jako metody instancji w klasie. Zawsze ma zastosowanie do istniejącego zasobu.

działania członków domyślnie: show, edit, update, destroy

  • :collection działania

URL do akcji :collection nie zawiera identyfikator zasobu docelowego. Np:

users/login 
users/register 

Można myśleć o :collection działania jako metody statycznej na klasy.

akcje zbiórki domyślnie: index, new, create

w Twoim przypadku potrzebne są dwa nowe działania w celu zarejestrowania. Te działania należą do: typ kolekcji (ponieważ nie masz identyfikatora użytkownika podczas przesyłania tych działań). Trasa może być następująca:

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

URL dla działań są następujące:

users/signup 
users/register 

Jeśli chcesz usunąć standardowego działania wygenerowany przez Rails używać: z wyjątkiem /: Tylko opcji:

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

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

Edycja 1

zwykle t odegrać akcję confirmation jako akcję :member. W tym przypadku params[id] będzie zawierał kod potwierdzający.

konfiguracja trasy:

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

URL

/users/xab3454a/confirm 

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

Kontroler

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, to wyjaśnienie wygląda świetnie. Jako kontynuację, by sprawdzić, czy rozumiem, powiedz, że chciałem wysłać link "potwierdzenie rachunku" w e-mailu powitalnym użytkownika. To łącze zawierałoby 8-znakowy skrót sprawdzania poprawności. Czy mogę dodać 'map.resources: users,: member => {: validate =>: get}'? W jaki sposób podłączono parametr 'hash'? –

+0

Zaktualizowałem moją odpowiedź, spójrz. –

+0

Co mówi 'confirm_user_path' używać' @ user.confirmation_code' zamiast wieloznacznika ': id' zamiast' @ user.foo' lub '@ user.bar'? Czy powinno to być 'confirm_user_path (: id => @ user.confirmation_code)'? –

1

Opcja new umożliwia tworzenie nowych tras do tworzenia nowych obiektów. Dlatego poprzedzone są one tym terminem.

To, czego szukasz, to opcja :collection.

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

Który stworzy /users/signup i /users/register adresy URL.

+0

Trudno mi było zrozumieć, do czego przeznaczona była "kolekcja". Trasa ** to ** do tworzenia nowych obiektów; odwiedzający, którzy zarejestrowali się, tworzą nowy obiekt "Użytkownik". Dlaczego więc nie chciałbym użyć "nowego"? Czy to jest literówka w Przewodniku po szynach? –

3

Jeśli dobrze rozumiem twoje pytanie, po prostu chcesz zmienić nazwy adresów URL działań new i create.

Robi się to tak:

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

Jeśli naprawdę chciałby dodać nowych tras z odpowiednimi działania kontrolera, a następnie Damiens odpowiedź jest droga.

+0

@mikezter, zdecydowanie potrzebuję tras 'new' i' create'. Jednak to odpowiada na pytanie o * zmianę nazwy * tras, które miałem w przeszłości. Dzięki :) –

12

ten może być traktowany jako jus t inna składnia - może być coś dobrego.

Składnia 1:

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

Rake Droga wyjścia obejmie

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

rs "}

Składnia 2: Jeśli masz tylko jedna droga kolekcja

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

Podoba mi się składnia 2, niezła awnser – Francois

Powiązane problemy