Подтвердить что ты не робот

Как добавить путь к просмотру частичного рендеринга 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
4b9b3361

Ответ 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" (или как бы то ни было ваше динамическое имя) для представлений, соответствующих вызываемому действию.

Он также достаточно умен, чтобы проверить все определенные пути для файла, который вы ищете, поэтому он возвращается к месту по умолчанию, если он не найден.