19

我想有以下目錄結構:如何添加Rails部分呈現查找的視圖路徑?

views/ 
    app1/ 
    users/_user.html.erb 
    users/index.html.erb 

    app2/ 
    users/index.html.erb 

    shared/ 
    users/_user.html.erb 
    users/index.html.erb 

在我看來,我會打電話給

# app1/users/index.html 
<%= render :partial => "user" %> 
# => /app1/users/_user.html.erb 


# app2/users/index.html 
<%= render :partial => "user" %> 
# => /shared/users/_user.html.erb 

所以基本上,我怎麼告訴Rails在/ APP 2,檢查/用戶目錄然後共享目錄,然後引發它缺少模板錯誤?

更新


我身邊這讓(由塞特希的建議,使用File.exist?

這裏是我的解決方案 - 反饋意見和建議表示歡迎

# application_helper.rb 

# Checks for a partial in views/[vertical] before checking in views/shared 
def partial_or_default(path_name, options={}, &block) 
    path_components   = path_name.split("/") 
    file_name    = path_components.pop 
    vertical_file_path  = File.join(vertical}, path_components, file_name) 
    shared_file_path  = File.join("shared", path_components, file_name) 
    full_vertical_file_path = File.join("#{Rails.root}/app/views/", "_#{vertical_file_path}.html.erb") 
    attempt_file_path  = File.exist?(full_vertical_file_path) ? vertical_file_path : shared_file_path 
    render({:partial => attempt_file_path}.merge(options), &block) 
end 
+1

任何你不能使用'File.exists?'來檢查文件是否退出並呈現相應文件的原因? – 2011-05-21 12:11:31

回答

61

有已經建成的軌道的東西,爲你提供這種類型的「主題」,它叫做prepend_view_path

http://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-prepend_view_path

還有用於將路徑查找堆的端append_view_path

我有這樣的生產成功合作:

class ApplicationController < ActionController::Base 
    before_filter :prepend_view_paths 

    def prepend_view_paths 
    prepend_view_path "app/views/#{current_app_code}" 
    end 
end 

現在每個控制器將首先在「視圖/ APP1」(或任何動態名原來是),對應於該行動的意見調用。

它也足夠聰明,可以檢查所查找文件的所有已定義路徑,因此如果找不到,它會回滾到默認位置。

+0

這真的很棒!我希望我們有這個實現...順便說一句,這剛剛在railscasts.269(但你的答案告訴一切已經) – ecoologic 2011-06-06 13:37:19

+1

正確的URL是:http://api.rubyonrails.org/classes/ActionController/Base。 html#M000267 – davidcollom 2012-11-29 14:54:20

+0

舊的,但是這裏有一個類方法,而不是用過濾器做這個 – 2013-11-20 19:40:11