2012-03-29 14 views
5

Czy istnieje sposób na zapewnienie domyślnej wartości dla pomocników adresów URL/ścieżek?Routing routingu: Podawanie wartości domyślnych dla pomocników ścieżek

Mam opcjonalny zakres owijania wokół wszystkich moich trasach:

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

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

end 

Chcę, aby użytkownicy mogli uzyskać dostęp do witryny za pomocą tych adresów URL:

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

dla wygody, jestem utworzenie @current_brand w moim 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 

Tak daleko tak dobrze, ale teraz muszę zmodyfikować wszystkie wywołania *_path i *_url, aby uwzględnić parametr :current_brand, mimo że jest opcjonalny. To jest naprawdę brzydkie, IMO.

Czy jest jakiś sposób, aby ułatwić programistom śledzenie ścieżki na @current_brand?

A może lepszy sposób na zdefiniowanie zakresu w routes.rb?

Odpowiedz

8

myślę, że chcesz zrobić coś takiego:

class ApplicationController < ActionController::Base 

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

end 

Ta metoda nazywa się automatycznie za każdym razem url jest zbudowany i jest to wynik jest połączone w parametrach.

Aby uzyskać więcej informacji na ten temat można spojrzeć na: default_url_options and rails 3

+0

dzięki. To jest rozwiązanie, z którym skończyłem. Tam też jest mnóstwo gotch, takich jak konieczność ustawienia tego w mailerach, i hack, aby to zadziałało z rspec (wkleiłem w mojej własnej odpowiedzi) – u2622

+0

Och, tak, przykro mi, że nie wskazuję tego . Cieszę się, że wspominałeś o tym dla kompletności. – CMW

5

Oprócz odpowiedzi CMW jest, aby zmusić go do pracy z RSpec dodałem ten siekać w 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 
Powiązane problemy