次のディレクトリ構造が欲しいのですが。
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/app2/usersディレクトリをチェックインしてから共有ディレクトリをチェックインしてから、テンプレートの欠落エラーが発生するように指示するにはどうすればよいですか?
私はこれを回避しました(Senthilが提案したように、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
Railsには、このタイプの「テーマ」を容易にするものがすでに組み込まれています。これは、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
これで、すべてのコントローラーは最初に「views/app1」(または動的な名前が判明したもの)を調べて、呼び出されているアクションに対応するビューを探します。
また、探しているファイルに対して定義されているすべてのパスをチェックするのに十分賢いので、見つからない場合はデフォルトの場所にロールバックします。