Как я могу добавить путь к представлению для частичного рендеринга 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, чтобы он зашел в каталог /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
1 ответ
Уже есть что-то встроенное в рельсы, которое облегчает вам этот тип "тематики". Это называется prepend_view_path.
http://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html
Также есть 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" (или как там будет ваше динамическое имя) представления, соответствующие вызываемому действию.
Он также достаточно умен, чтобы проверить все заданные пути к файлу, который вы ищете, поэтому он откатывается к местоположению по умолчанию, если оно не найдено.