2012-03-29 39 views
5

Có cách nào để cung cấp giá trị mặc định cho người trợ giúp url/đường dẫn không?Định tuyến đường ray: Cung cấp giá trị mặc định cho người trợ giúp đường dẫn

Tôi có một phạm vi tùy chọn gói xung quanh tất cả các tuyến đường của tôi:

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

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

end 

tôi muốn người dùng có thể truy cập trang web bằng cách sử dụng các URL:

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

Để thuận tiện, Tôi thiết lập một @current_brand trong ApplicationController tôi:

# 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 

Vì vậy, rất tốt, nhưng bây giờ tôi phải sửa đổi tất cả các yêu cầu *_path*_url để bao gồm thông số :current_brand, mặc dù nó là tùy chọn. Điều này thực sự xấu xí, IMO.

Có cách nào để tôi có thể giúp những người trợ giúp đường dẫn tự động nhận trên @current_brand không?

Hoặc có lẽ cách tốt hơn để xác định phạm vi trong routes.rb?

Trả lời

8

Tôi nghĩ rằng bạn sẽ muốn làm một cái gì đó như thế này:

class ApplicationController < ActionController::Base 

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

end 

Phương pháp này được gọi là tự động mỗi url thời gian được xây dựng và đó là kết quả được sáp nhập vào các thông số.

Để biết thêm thông về vấn đề này, xem xét: default_url_options and rails 3

+0

Cảm ơn. Đây là giải pháp mà tôi đã kết thúc. Ở đó chúng tôi có rất nhiều gotchas, chẳng hạn như cần phải thiết lập điều này trong các bưu phẩm, và một hack để làm cho nó làm việc với rspec (dán trong câu trả lời của riêng tôi) – u2622

+0

Ồ, vâng, tôi xin lỗi vì đã không chỉ ra điều này . Vui mừng bạn đã đề cập đến nó để hoàn thành. – CMW

5

Ngoài câu trả lời CMW, để có được nó để làm việc với rspec, tôi đã thêm hack này trong 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 
Các vấn đề liên quan