默認情況下,Rails可以找到的格式,語言環境和模板語言文件名中的觀點(這樣我就可以創建index.de.json.erb
)自定義變量查看文件名
是否有可能增加另一個,自定義參數到視圖的文件名?
我想通過當前的子域,所以http://foo.example.com/
會使index.foo.html.erb
和http://bar.example.com/
會使index.bar.html.erb
(兩者以index.html.erb
回退)。
默認情況下,Rails可以找到的格式,語言環境和模板語言文件名中的觀點(這樣我就可以創建index.de.json.erb
)自定義變量查看文件名
是否有可能增加另一個,自定義參數到視圖的文件名?
我想通過當前的子域,所以http://foo.example.com/
會使index.foo.html.erb
和http://bar.example.com/
會使index.bar.html.erb
(兩者以index.html.erb
回退)。
用於查看視圖的解析模式只能包含使用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進行測試)
我不認爲您需要自定義處理程序。你不會對你的模板做一些預認證,但你只需要你的模板就可以成爲域特定的。
我會考慮做這樣的事情:
# 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以允許在缺少域視圖的情況下的默認值。
謝謝!這顯然是我需要的。 – user1105595
很高興我能提供幫助,歡迎來到Stack Overflow。如果一個答案解決了你的問題,你應該將其標記爲已接受,關於如何和爲什麼在這裏的更多信息:http://meta.stackexchange.com/a/5235 – georgebrock