Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I create a Rails 3 route that will match all requests and direct to one resource / page?

Tags:

I have a rails app (Rails 3.0) that I need to temporarily take out of service. While this is in effect, I want to create a new route that will direct all requests to a single piece of static content. I have a controller set up to serve my static pages.

I tried something like this:

match '*' => 'content#holding'

and

match '*/*' => 'content#holding'

to match a wildcard route as described here:Rails 3 route globbing without success.

This is probably a really simple answer, but I couldn't figure it out.

/EDIT/ Forgot to mention that I did have this rule at the very top of my routes.rb file.

like image 883
Nick Avatar asked Dec 30 '11 14:12

Nick


People also ask

What is match in Rails routes?

Rails routes are matched in the order they are specified, so if you have a resources :photos above a get 'photos/poll' the show action's route for the resources line will be matched before the get line. To fix this, move the get line above the resources line so that it is matched first.

How can you list all routes for a Rails application?

TIP: If you ever want to list all the routes of your application you can use rails routes on your terminal and if you want to list routes of a specific resource, you can use rails routes | grep hotel . This will list all the routes of Hotel.

How many types of routes are there in Rails?

Rails RESTful Design which creates seven routes all mapping to the user controller. Rails also allows you to define multiple resources in one line.


3 Answers

Rails needs to bind the url parameters to a variable, try this:

match '*foo' => 'content#holding'

If you also want to match /, use parenthesis to specify that foo is optional:

match '(*foo)' => 'content#holding'
like image 143
klochner Avatar answered Sep 28 '22 05:09

klochner


I did this just yesterday and first came up with the solution that klochner shows. What I didn't like about this is the fact that whatever you enter in the URL, stays there after the page loads, and since I wanted a catch all route that redirects to my root_url, that wasn't very appealing.

What I came up with looks like this:

# in routes.rb
get '*ignore_me' => 'site#unknown_url'

# in SiteController
def unknown_url
  redirect_to root_url
end

Remember to stick the routes entry at the very bottom of the file!

EDIT: As Nick pointed out, you can also do the redirect directly in the routes file.

like image 38
cvshepherd Avatar answered Sep 28 '22 04:09

cvshepherd


I ran into something like this where I had domain names as a parameter in my route:

match '/:domain_name/', :to => 'sitedetails#index', :domain_name => /.*/, :as =>'sitedetails'

The key piece to this was the /.*/ which was a wildcard for pretty much anything. So maybe you could do something like:

match '/:path/', :to => 'content#holding', :path=> /.*/, :as =>'whatever_you_want'
like image 39
fregas Avatar answered Sep 28 '22 05:09

fregas