In config/routes.rb, I tried both:

root :to => 'things#index', :as => 'things'

and

root :to => 'things#index'

When I hit http://localhost:3000/, both approaches work, and nothing seems to be different.

What is the :as option used for?


Solution 1:

The :as option forms a named route.

Usually it's used in a non-root route. For example:

match '/search' => 'search#search', :as => 'search' # SearchController#search

You could then do something like:

<%= link_to search_path, 'Click Here to Search!' %>

search_path and search_url are defined because of the :as

For a root route, you don't really need :as because the the URL helpers root_path and root_url are defined for you by Rails.

Solution 2:

Rails 4 compatible.

In path_to_your_app/config/routes.rb

get "/profile/edit" => "users#profile_edit", :as => "edit_me"

Since ruby 2.0 you can use:

get "/profile/edit", to: "users#profile_edit", as: "edit_me"

In path_to_your_app/app/views/**in required view

<%= link_to "Edit profile", edit_me_path %>

Do not use match if you aren't sure you need it:

It creates a vulnerability when you use it in next pattern:

match ':controller/:action/:id'

From documentation:

You should not use the match method in your router without specifying an HTTP method. If you want to expose your action to both GET and POST, add via: [:get, :post] option. If you want to expose your action to GET, use get in the router:

Instead of: match "controller#action"

Do: get "controller#action"

Read more about:

About match

http://github.com/rails/rails/issues/5964

About routes mapping

http://apidock.com/rails/v4.0.2/ActionDispatch/Routing/Mapper/Base/match

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html

About routes in general

http://api.rubyonrails.org/classes/ActionDispatch/Routing.html