2012-03-29 16 views
5

¿Hay alguna forma de proporcionar un valor predeterminado a los helpers url/path?Enrutamiento de rieles: Dar valores predeterminados para ayudantes de ruta

que tienen un alcance opcional envolver alrededor de todos mis rutas:

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

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

end 

Quiero que los usuarios puedan acceder al sitio usando estas URL:

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

Para mayor comodidad, estoy la creación de un @current_brand en mi 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 

Así todo bien, pero ahora debo modificar todas las llamadas *_path y *_url para incluir el parámetro :current_brand, aunque es opcional. Esto es realmente feo, IMO.

¿Hay alguna manera en que pueda hacer que los ayudantes de ruta recojan automágicamente en @current_brand?

¿O quizás una mejor manera de definir el alcance en routes.rb?

Respuesta

8

creo que tendrá que hacer algo como esto:

class ApplicationController < ActionController::Base 

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

end 

Este método es llamado automáticamente cada vez que se construye y url es resultado se combinó en los parámetros.

Para obtener más información sobre esto, mire: default_url_options and rails 3

+0

Gracias. Esta es la solución con la que terminé. También tenemos muchos problemas, como la necesidad de configurar esto en los anuncios publicitarios, y un truco para hacer que funcione con rspec (pegado en mi propia respuesta) – u2622

+0

Oh, sí, lo siento por no señalar esto . Me alegra que lo hayas mencionado por completo. – CMW

5

Además de la respuesta de CMW, para conseguir que funcione con rspec, añadí este corte en 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 
Cuestiones relacionadas