In urls and rails routing, what is the difference between using a slash character vs a pound sign (hash sign) character?
These work
get "/static_pages/about"
get 'about', to: 'static_pages#about', as: :about
These don't
get "/static_pages#about"
get 'about', to: 'static_pages/about', as: :about
get 'about', to: '/static_pages#about', as: :about
What code controls this behavior, and what is the deeper reason behind it?
ANSWER:
(The two people answered it very well, and I had trouble choosing which one to mark as the accepted answer. I wish to state my understanding of the answer in a different way that might help people.)
Once you use the / symbol, the string gets recognized as a url string appended to the base url. So a '#' character will be interpreted as part of the url, and urls don't like to take '#' characters.
In the case of not using a / character, the first word is recognized somehow as a controller name, which you follow up with a '#' and an action name.
Rails RESTful Design which creates seven routes all mapping to the user controller. Rails also allows you to define multiple resources in one line.
Difference between singular resource and resources in Rails routes. So far, we have been using resources to declare a resource. Rails also lets us declare a singular version of it using resource. Rails recommends us to use singular resource when we do not have an identifier.
Rails routing is a two-way piece of machinery – rather as if you could turn trees into paper, and then turn paper back into trees. Specifically, it both connects incoming HTTP requests to the code in your application's controllers, and helps you generate URLs without having to hard-code them as strings.
rb . The Rails router recognises URLs and dispatches them to a controller's action. It can also generate paths and URLs, avoiding the need to hardcode strings in your views. Let's consider an application to book rooms in different Hotels and take a look at how this works.
In ruby, the hash symbol generally precedes the name of a instance method of a class. See the left sidebar of the page of the Array class documentation (http://www.ruby-doc.org/core-2.1.0/Array.html).
get "/static_pages#about" doesn't work because #about is not part of the url.
get 'about', to: 'static_pages/about', as: :about doesn't work because /about doesn't indicate which controller method should be called.
get 'about', to: '/static_pages#about', as: :about doesn't work because of the preceding slash before static_pages.
The # in to: 'static_pages#about' means about action of static_pages_controller. The syntax is controller#action.
When you define get "/static_pages#about", static_pages#about becomes the controller for the route i.e. the # is only a character literal and #about does not mean about action. You should get a missing :controller error if static_pages#about controller does not exist.
The following route definition gives you /about path which maps to static_pages/about controller's about action, where static_pages could either be a namespace or a scope.
get 'about', to: 'static_pages/about', as: :about
The following route is invalid and should throw an error due to the leading slash / in to option.
get 'about', to: '/static_pages#about', as: :about
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