Как добавить путь к просмотру частичного рендеринга 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/users, а затем в общем каталоге, прежде чем он вызывает ошибку в шаблоне?
Update
Я обошел это (как предложил Шентиль, используя 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
Там уже что-то встроено в рельсы, что облегчает этот тип "тематики" для вас. Он называется 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" (или как бы то ни было ваше динамическое имя) для представлений, соответствующих вызываемому действию.
Он также достаточно умен, чтобы проверить все определенные пути для файла, который вы ищете, поэтому он возвращается к месту по умолчанию, если он не найден.