Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
      # A simple route match, sends "/contact" to Info#contact
      # (i.e. the 'contact' method inside the 'Info' controller)
      r.match("/contact").
        to(:controller => "info", :action => "contact")
      
      # Use placeholders (e.g. :book_id) in the match, and they will be passed along to params
      r.match("/books/:book_id/:action").
        to(:controller => "books")
      
      # Use placeholders in the "to" results for more complicated routing, e.g. for modules
      r.match("/admin/:module/:controller/:action").
        to(:controller => ":module/:controller")
      r.match("/admin/:module/:controller/:action/:id").
        to(:controller => ":module/:controller")
      
      # Use a block to factor out repetitive parts
      r.match("/accounts") do |a|
        # The following will match "/accounts/overview" and route to Accounts#overview
        a.match("/overview").
          to(:controller => "accounts", :action => "overview")
        a.match("/:id/:action").
          to(:controller => "accounts")
        a.match("/:id/:action.:format").
          to(:controller => "accounts")
      end
      
      # Use a regular expression as the path matcher.  Note that you must specify the
      # ^ (beginning of line) and $ (end of line) boundaries if you desire them.
      r.match(%r{^/movies/:id/movie-[a-z][a-zA-Z\-]+$}).
        to(:controller => "movies", :action => "search_engine_optimizer")
      
      # Use square-bracket notation to replace param results with captures from the path
      r.match(%r[^/movies/(\d+)-(\d+)-(\d+)$]).
        to(:controller => "movies", :movie_id => "[1][2][3]", :action => "show")

      # Use the second optional argument of 'match' to be more specific about the request;
      # in this case, only accept the POST method for the /movies/create action
      r.match("/movies/create", :method => "post").
        to(:controller => "movies", :action => "create")
      
      # Use variables from the 'match' as results sent to the controller in the params hash,
      # e.g. :user_agent[1] will be replaced with either 'MSIE' or 'Gecko' in the following case:
      r.match(%r[^/movies/(.+)], :user_agent => /(MSIE|Gecko)/).
        to(:controller => "movies", :title => "[1]", :action => "show", :agent => ":user_agent[1]")

      # The 'match' method can also be called without the path string or regexp.
      # In this example, direct all insecure traffic to a Insecure#index
      r.match(:protocol => "http://").
        to(:controller => "insecure", :action => "index")

      # Use anonymous placeholders in place of the ugly-looking pattern, /([^\/.,;?]+)/
      r.match("/::/users/::").
        to(:controller => "users", :action => "[2]", :id => "[1]")
      
      # Putting it all together, and adding the requirement that we use an "admin" prefix on the
      # domain (e.g. admin.mysite.com), do some interesting stuff:
      r.match(:domain => /^admin\b/) do |admin|
        admin.match(%r[/([A-Z]\w+)\+([A-Z]\w+)/::]).
          to(:controller => "admin/users", :action => ":path[3]",
            :first_name => ":path[1]", :last_name => ":path[2]")
      end.to(:controller => "admin/users", :action => "default")
      # Note that the last line above sends all traffic in the "admin" subdomain to the
      # Admin::Users#default action if no other route is matched.

      # Create a deferred route.  In this case, the decision of whether or not the route
      # is a match is made via the .xhr? call.  Note that it's ok to put the hash in a
      # conditional because if the "if" statement is false, ruby returns nil (i.e. no match).
      r.match(%r[^/deferred]).defer_to do |request, path_match|
        {:controller => "ajax", :action => "index"} if request.xhr?
      end
      
      # Use the matches from the path in a deferred route
      r.match("/deferred/:action").defer_to do |request, path_match|
        {:controller => "deferred", :action => path_match[1]}
      end