Использование define_method в Ruby on Rails помощники вида - PullRequest
1 голос
/ 23 октября 2019

Я создаю библиотеку компонентов в 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?

...