require 'active_support/core_ext/object/to_param' require 'active_support/core_ext/regexp' module ActionDispatch # == Routing # # The routing module provides URL rewriting in native Ruby. It's a way to # redirect incoming requests to controllers and actions. This replaces # mod_rewrite rules. Best of all, Rails' Routing works with any web server. # Routes are defined in config/routes.rb. # # Consider the following route, which you will find commented out at the # bottom of your generated config/routes.rb: # # match ':controller(/:action(/:id(.:format)))' # # This route states that it expects requests to consist of a # :controller followed optionally by an :action that in # turn is followed optionally by an :id, which in turn is followed # optionally by a :format # # Suppose you get an incoming request for /blog/edit/22, you'll end # up with: # # params = { :controller => 'blog', # :action => 'edit', # :id => '22' # } # # Think of creating routes as drawing a map for your requests. The map tells # them where to go based on some predefined pattern: # # AppName::Applications.routes.draw do |map| # Pattern 1 tells some request to go to one place # Pattern 2 tell them to go to another # ... # end # # The following symbols are special: # # :controller maps to your controller name # :action maps to an action with your controllers # # Other names simply map to a parameter as in the case of :id. # # == Named routes # # Routes can be named by passing an :as option, # allowing for easy reference within your source as +name_of_route_url+ # for the full URL and +name_of_route_path+ for the URI path. # # Example: # # # In routes.rb # match '/login' => 'accounts#login', :as => 'login' # # # With render, redirect_to, tests, etc. # redirect_to login_url # # Arguments can be passed as well. # # redirect_to show_item_path(:id => 25) # # Use root as a shorthand to name a route for the root path "". # # # In routes.rb # root :to => 'blogs#index' # # # would recognize http://www.example.com/ as # params = { :controller => 'blogs', :action => 'index' } # # # and provide these named routes # root_url # => 'http://www.example.com/' # root_path # => '' # # Note: when using +controller+, the route is simply named after the # method you call on the block parameter rather than map. # # # In routes.rb # controller :blog do # match 'blog/show' => :list # match 'blog/delete' => :delete # match 'blog/edit/:id' => :edit # end # # # provides named routes for show, delete, and edit # link_to @article.title, show_path(:id => @article.id) # # == Pretty URLs # # Routes can generate pretty URLs. For example: # # match '/articles/:year/:month/:day', :constraints => { # :controller => 'articles', # :action => 'find_by_date', # :year => /\d{4}/, # :month => /\d{1,2}/, # :day => /\d{1,2}/ # } # # Using the route above, the URL "http://localhost:3000/articles/2005/11/06" # maps to # # params = {:year => '2005', :month => '11', :day => '06'} # # == Regular Expressions and parameters # You can specify a regular expression to define a format for a parameter. # # controller 'geocode' do # match 'geocode/:postalcode' => :show', :constraints => { # :postalcode => /\d{5}(-\d{4})?/ # } # # Constraints can include the 'ignorecase' and 'extended syntax' regular # expression modifiers: # # controller 'geocode' do # match 'geocode/:postalcode' => :show', :constraints => { # :postalcode => /hx\d\d\s\d[a-z]{2}/i # } # end # # controller 'geocode' do # match 'geocode/:postalcode' => :show', :constraints => { # :postalcode => /# Postcode format # \d{5} #Prefix # (-\d{4})? #Suffix # /x # } # end # # Using the multiline match modifier will raise an ArgumentError. # Encoding regular expression modifiers are silently ignored. The # match will always use the default encoding or ASCII. # # == HTTP Methods # # With conditions you can define restrictions on routes. Currently the only valid condition is :method. # # * :method - Allows you to specify which HTTP method(s) can access the route. Possible values are # :post, :get, :put, :delete and :any. Use an array to specify more # than one method, e.g. [ :get, :post ]. The default value is :any, :any means that any # method can access the route. # # Example: # # get 'post/:id' => 'posts#show' # post 'post/:id' => "posts#create_comment' # # Now, if you POST to /posts/:id, it will route to the create_comment action. A GET on the same # URL will route to the show action. # # == Reloading routes # # You can reload routes if you feel you must: # # Rails::Application.reload_routes! # # This will clear all named routes and reload routes.rb if the file has been modified from # last load. To absolutely force reloading, use reload!. # # == Testing Routes # # The two main methods for testing your routes: # # === +assert_routing+ # # def test_movie_route_properly_splits # opts = {:controller => "plugin", :action => "checkout", :id => "2"} # assert_routing "plugin/checkout/2", opts # end # # +assert_routing+ lets you test whether or not the route properly resolves into options. # # === +assert_recognizes+ # # def test_route_has_options # opts = {:controller => "plugin", :action => "show", :id => "12"} # assert_recognizes opts, "/plugins/show/12" # end # # Note the subtle difference between the two: +assert_routing+ tests that # a URL fits options while +assert_recognizes+ tests that a URL # breaks into parameters properly. # # In tests you can simply pass the URL or named route to +get+ or +post+. # # def send_to_jail # get '/jail' # assert_response :success # assert_template "jail/front" # end # # def goes_to_login # get login_url # #... # end # # == View a list of all your routes # # Run rake routes. # module Routing autoload :DeprecatedMapper, 'action_dispatch/routing/deprecated_mapper' autoload :Mapper, 'action_dispatch/routing/mapper' autoload :Route, 'action_dispatch/routing/route' autoload :RouteSet, 'action_dispatch/routing/route_set' autoload :UrlFor, 'action_dispatch/routing/url_for' SEPARATORS = %w( / . ? ) HTTP_METHODS = [:get, :head, :post, :put, :delete, :options] # A helper module to hold URL related helpers. module Helpers include ActionController::PolymorphicRoutes end end end