Я создаю библиотеку компонентов в Rails, используя частичные представления. Я хотел бы, чтобы каждый компонент, определенный в /app/views/components
, имел соответствующий вспомогательный метод для рендеринга компонента. Вот код ComponentHelper, который не работает:
*/app/views/components/_navigation.haml*
...navigation view partial...
*/app/helpers/components_helper.rb*
module ComponentsHelper
extend ActiveSupport::Concern
included do
Dir.entries("#{Rails.root}/app/views/components") do |filename|
next if filename =~ /^..?$/
component_name = File.basename(filename, '.haml')[1..-1]
define_method component_name do |*options, &block|
component(component_name, *options, &block)
end
end
end
def component(name, *options, &block)
render("components/#{name}", *options, &block)
end
end
*/app/views/home.haml*
.page-home
= navigation
...rest of view
Это приводит к ActionView::Template::Error (undefined local variable or method 'navigation' for #<#<Class...
. Метод не определен. Как я могу гарантировать, что эти методы создаются динамически, когда помощник включен вместе со всеми другими помощниками Rails?