I'm reading these two pages
resourcesAdding more RESTful actionsThe Rails Guides page shows
map.resources :photos, :new => { :upload => :post } And its corresponding URL
/photos/upload This looks wonderful.
My routes.rb shows this
map.resources :users, :new => { :signup => :get, :register => :post } When I do: [~/my_app]$ rake routes
I see the two new routes added
signup_new_user GET /users/new/signup(.:format) register_new_user POST /users/new/register(.:format) Note the inclusion of /new! I don't want that. I just want /users/signup and /users/register (as described in the Rails Routing Guide).
Any help?
In Rails, a RESTful route provides a mapping between HTTP verbs, controller actions, and (implicitly) CRUD operations in a database. A single entry in the routing file, such as. map.resources :photos. creates seven different routes in your application: HTTP verb.
A RESTful route is a route that provides mapping from HTTP verbs (get, post, put, delete, patch) to controller CRUD actions (create, read, update, delete). Instead of relying solely on the URL to indicate what site to visit, a RESTful route depends on the HTTP verb and the URL.
When you expose a controller as a resource, following actions are automatically added:
show index new create edit update destroy These actions can be categorized in to two groups:
:member actionsThe URL for the member action has the id of the target resource. E.g:
users/1/edit users/1 You can think of :member action as an instance method on a class. It always applies on an existing resource.
Default member actions: show, edit, update, destroy
:collection actionsThe URL for the :collection action does not contain the id of the target resource. E.g:
users/login users/register You can think of :collection action as a static method on a class.
Default collection actions: index, new, create
In your case you need two new actions for registration. These actions belong to :collection type( as you do not have the id of the user while submitting these actions). Your route can be as follows:
map.resources :users, :collection => { :signup => :get, :register => :post } The URL for the actions are as follows:
users/signup users/register If you want to remove a standard action generated by Rails use :except/:only options:
map.resources :foo, :only => :show map.resources :foo, :except => [:destroy, :show] Edit 1
I usually treat the confirmation action as a :member action. In this case params[id] will contain the confirmation code.
Route configuration:
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
This can be taken as just another syntax -- something good to know may be.
Syntax 1:
resources :users do member do get 'signup' post 'register' end end Rake Route Output will include
signup_users GET /users/signup(.:format) {:action=>"signup", :controller=>"users"} register_users POST /users/register(.:format) {:action=>"register", :controller=>"use rs"}
Syntax 2: If you have only one collection route
resources :users do get 'signup', :on => :collection end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With