2012-08-30 76 views
5

默認情況下,Rails可以找到的格式,語言環境和模板語言文件名中的觀點(這樣我就可以創建index.de.json.erb自定義變量查看文件名

是否有可能增加另一個,自定義參數到視圖的文件名?

我想通過當前的子域,所以http://foo.example.com/會使index.foo.html.erbhttp://bar.example.com/會使index.bar.html.erb(兩者以index.html.erb回退)。

回答

8

用於查看視圖的解析模式只能包含使用ActionView::LookupContext類註冊的變量。因此,第一步是用LookupContext類註冊一個新變量(subdomain)。你應該在初始化做到這一點:

ActionView::LookupContext.register_detail(:subdomain) do 
    ['default_subdomain'] 
end 

現在LookupContext知道關於subdomain,它可以被包含在解決模式。有關更改分辨率模式的更多細節,請參見ActionView::FileSystemResolver documentation,但本質上應包括以下內容,也是一個初始化:

ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
    Rails.root.join('app', 'views'), 
    ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}' 
) 

這種模式最終被傳遞到Dir.glob(後:*變量已被替換)。 glob模式{.:subdomain,}意味着.:subdomain」或者什麼也不是「」,如果沒有找到包含子域的文件,它將提供回退到沒有子域的視圖文件。

的最後一步是更新你的ApplicationController通過子域的LookupContext

class ApplicationController < ActionController::Base 
    def details_for_lookup 
    {:subdomain => [request.subdomain]} 
    end 
end 

(這個答案大部分是通過閱讀源代碼想通了,其中的一些功能沒有記載這是使用Rails 3.2.5進行測試)

+0

謝謝!這顯然是我需要的。 – user1105595

+0

很高興我能提供幫助,歡迎來到Stack Overflow。如果一個答案解決了你的問題,你應該將其標記爲已接受,關於如何和爲什麼在這裏的更多信息:http://meta.stackexchange.com/a/5235 – georgebrock

1

我不認爲您需要自定義處理程序。你不會對你的模板做一些預認證,但你只需要你的模板就可以成爲域特定的。

我會考慮做這樣的事情:

# in ApplicationController: 
    before_filter :set_view_paths 

    def set_view_paths 
    self.class.view_paths = Rails.root.join('app', 'views', controller_name, request.subdomain) 
    end 

然後,你必須把你的模板爲foo域到每個views/controller_name路徑foo文件夾。

還檢查append/prepend_view_path documentation以允許在缺少域視圖的情況下的默認值。