4

Is there some way to provide a default value to the url/path helpers?

I have an optional scope wrapping around all of my routes:

#config/routes.rb
Foo::Application.routes.draw do

  scope "(:current_brand)", :constraints => { :current_brand => /(foo)|(bar)/ } do
    # ... all other routes go here
  end

end

I want users to be able to access the site using these URLs:

/foo/some-place
/bar/some-place
/some-place

For convenience, I'm setting up a @current_brand in my ApplicationController:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :set_brand

  def set_brand                                                                 
    if params.has_key?(:current_brand)                                          
      @current_brand = Brand.find_by_slug(params[:current_brand])               
    else                                                                        
      @current_brand = Brand.find_by_slug('blah')
    end
  end

 end

So far so good, but now I must modify all *_path and *_url calls to include the :current_brand parameter, even though it is optional. This is really ugly, IMO.

Is there some way I can make the path helpers automagically pick up on @current_brand?

Or perhaps a better way to define the scope in routes.rb?

u2622
  • 2,991
  • 3
  • 25
  • 27

2 Answers2

7

I think you will want to do something like this:

class ApplicationController < ActionController::Base

  def url_options
    { :current_brand => @current_brand }.merge(super)
  end

end

This method is called automatically every time url is constructed and it's result is merged into the parameters.

For more info on this, look at: default_url_options and rails 3

Community
  • 1
  • 1
CMW
  • 3,093
  • 1
  • 16
  • 20
  • Thanks. This is the solution I ended up going with. There we lots of gotchas as well, such as needing to set this up in the mailers, and a hack to get it to work with rspec (pasted in my own answer) – u2622 Apr 07 '12 at 19:04
  • Oh, yes, I'm sorry for not pointing this out. Glad you mentioned it for completeness. – CMW Apr 08 '12 at 18:35
4

In addition to CMW's answer, to get it to work with rspec, I added this hack in spec/support/default_url_options.rb

ActionDispatch::Routing::RouteSet.class_eval do
  undef_method :default_url_options
  def default_url_options(options={})
    { :current_brand => default_brand }
  end
end
u2622
  • 2,991
  • 3
  • 25
  • 27