Макеты присутствуют в файле app/apps/themes/default_theme/views/layouts. У меня есть интерфейсный контроллер, который отображает макеты различных тем на основе параметров. А пока предположим, что он отображает default_theme. Но как установить тему по умолчанию?
module MyEngine
class FrontendController < ApplicationController
before_action :set_theme_view_path
layout :determine_layout
def index
end
private
def set_theme_view_path
theme = 'default_theme'
# Add both the layouts and views paths for the theme
theme_layout_path = MyEngine::Engine.root.join('app', 'apps', 'themes', theme, 'views', 'layouts')
theme_view_path = MyEngine::Engine.root.join('app', 'apps', 'themes', theme, 'views')
prepend_view_path(theme_layout_path)
prepend_view_path(theme_view_path)
end
def determine_layout
theme = 'default_theme'
"layouts/application"
end
end
end
Как динамически визуализировать макет во время выполнения? В моем случае просто конкретный макет из другой папки вместо обычных макетов внутри папки представлений?
Вам не нужно добавлять theme_layout_path
. Имя макета должно быть относительно views/layouts
:
before_action :set_theme_view_path
layout :determine_layout
private
def set_theme_view_path
theme = "default_theme"
prepend_view_path MyEngine::Engine.root.join("app/apps/themes/#{theme}/views")
end
def determine_layout
# "app/apps/themes/default_theme/views/layouts/default_theme_layout.html.erb"
"default_theme_layout"
end
В MyEngine::FrontendController#index отсутствует шаблон для форматов запроса: text/html ПРИМЕЧАНИЕ. Rails обычно ожидает, что действие контроллера отобразит шаблон представления с тем же именем. Например, действие MyEngine::FrontendController#index, определенное в app/controllers/myengine/frontend_controller.rb, должно иметь соответствующий шаблон представления в файле с именем app/views/frontend/index.html.erb. Я определил шаблон в app/apps/themes/default_theme/views/frontend/index.html.erb. Но все равно показывает ту же ошибку. @Алекс
@KrapiRastogi сообщение об ошибке не совсем правильное, пространство имен вашего представления должно быть таким же, как и у вашего контроллера: app/apps/themes/default_theme/views/my_engine/frontend/index.html.erb
Спасибо @Alex, ты мне очень помог. Я застрял на нем несколько дней!
guides.rubyonrails.org/layouts_and_rendering.html