Мне не удалось найти другие ресурсы, кроме этого SO вопроса по этой теме, поэтому я пишу о своих усилиях здесь.
В Rails 3.2+ (также протестировано в 4.2), можно получить доступ и изменить lookup_context.prefixes
из действия контроллера.Итак, чтобы изменить поиск шаблона и частичных префиксов для включения другого пути, вы можете сделать это:
class MyObjectsController < ApplicationController
def show
# WARNING: Keep reeding for issues with this approach!
unless lookup_context.prefixes.first == "partials"
lookup_context.prefixes.prepend "partials"
end
end
end
Таким образом, если в * есть шаблон show.html.erb 1013 * app / views / partials / папка, то она будет отображена.И то же самое относится к любым частям, указанным в show.html.erb .
Что здесь происходит?
Метод lookup_context
возвращает объект типа ActionView::LookupContext
, который является ответственным за хранение всей информации, необходимой для поиска шаблонов в ActionView
.Следует отметить, что он также дает вам доступ к lookup_context.view_paths
, то есть не , что запрашивается в этом вопросе, но звучит , как и должно быть.
ПРЕДУПРЕЖДЕНИЕ
Модификация массива lookup_context.prefixes
кэшируется для всех будущих запросов.Поэтому, чтобы использовать его без проблем, лучше всего убедиться, что мы также удалили все префиксы, которые мы добавили.
Итак, есть ли простой способ сделать это?
Конечно.Для своих собственных проектов я создал модуль, который я могу включить в любой контроллер, которому нужна эта способность (или просто включить его в ApplicationController
).Вот мой код:
# Helper methods for adding ActionView::LookupContext prefixes on including
# controllers. The lookup_context.prefixes collection is persisted on cached
# controllers, so these helpers take care to remove the passed-in prefixes
# after calling the block.
#
# @example Expected Usage:
# around_action only: :show do |_, block|
# prepend_lookup_context_prefixes("my_optional_name_space/my_objects", &block)
# end
#
# around_action only: %i[index edit update] do |_, block|
# append_penultimate_lookup_context_prefixes("my_optional_name_space/my_objects", &block)
# end
module PrefixesHelper
# Prepends the passed in prefixes to the current `lookup_context.prefixes`
# array, calls the block, then removes the prefixes.
#
# @param [Array<String>] prefixes
def prepend_lookup_context_prefixes(*prefixes, &block)
lookup_context.prefixes.prepend(*prefixes)
block.call
remove_lookup_context_prefixes(*prefixes, index: 0)
end
# Sets the penultimate (2nd-to-last) prefixes in the current
# `lookup_context.prefixes` array, calls the block, then removes the prefixes.
#
# @param [Array<String>] prefixes
def append_penultimate_lookup_context_prefixes(*prefixes, &block)
lookup_context.prefixes.insert(-2, *prefixes)
block.call
remove_lookup_context_prefixes(*prefixes.reverse, index: -2)
end
# Removes the passed in prefixes from the current `lookup_context.prefixes`
# array. If index is passed in, then will only remove prefixes found at the
# specified index in the array.
#
# @param [Array<String>] prefixes
# @param [Integer] index
def remove_lookup_context_prefixes(*prefixes, index: nil)
prefixes.each do |prefix|
if index
if lookup_context.prefixes[index] == prefix
lookup_context.prefixes.delete_at(index)
end
else
lookup_context.prefixes.delete(prefix)
end
end
end
end
Как уже упоминалось в комментариях к этому модулю, ожидаемое использование этого модуля - вызов методов, содержащихся в нем, посредством вызова around_filter
в вашем контроллере.Таким образом, модуль позаботится об удалении любых префиксов, которые он добавляет после выполнения действия контроллера.
Например:
around_filter only: :show do |_, block|
prepend_lookup_context_prefixes("my_optional_name_space/my_objects", &block)
end
Или:
around_filter only: %i[index edit update] do |_, block|
append_penultimate_lookup_context_prefixes("my_optional_name_space/my_objects", &block)
end
Я также включил модуль PrefixesHelper
, размещенный здесь, в гем, который я использую, чтобы добавить несколько хороших расширений, подобных этим, в мои приложения на Rails.Если вы хотите использовать его, см. Здесь: https://github.com/pdobb/core_extensions