Ruby on rails 在RubyonRails视图帮助程序中使用define_方法

Ruby on rails 在RubyonRails视图帮助程序中使用define_方法,ruby-on-rails,components,metaprogramming,helper,Ruby On Rails,Components,Metaprogramming,Helper,我正在使用视图部分在Rails中创建一个组件库。我希望/app/views/components中定义的每个组件都有一个相应的帮助器方法来呈现组件。以下是不起作用的ComponentHelper代码: */app/views/components/_navigation.haml* ...navigation view partial... */app/helpers/components_helper.rb* module ComponentsHelper extend Active

我正在使用视图部分在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(未定义的局部变量或方法“navigation”用于#您使用的Rails版本是什么?在定义方法后是否尝试添加
helper\u方法组件名称
,使其成为视图中可用的辅助方法?我个人不喜欢名为“ComponentsHelper”的模块的想法这实际上是一个ActiveSupport::Concern(concerns应该放在concerns文件夹中,concerns和helper模块最后都是模块,但每个模块的约定都不同,您将两种想法混合在一起,我想您想要的是一个helper模块,而不是关注点)Rails-v6.0.0.
组件
助手已经在每个Rails的所有视图中可用,包括所有视图中的所有助手。我同意
ActiveSupport::Concern
在这里没有任何业务–我想利用
包含的do
但是
Dir
循环从未运行来定义组件助手方法。在设置
config.action\u controller.include\u all\u helpers=false
后,我尝试在
ApplicationController
中手动包含helper,但手动包含并不是解决问题的方法。最新消息:这似乎是
Dir
的问题。使用数组文本动态定义方法
[:导航].每个{名称{定义方法(名称)…}
没有问题。非常困惑为什么
Dir
在这种情况下会短路。您使用的Rails版本是什么?您是否尝试在定义方法后添加
helper\u方法组件\u名称
,使其成为视图中可用的辅助方法?我个人不喜欢名为“ComponentsHelper”的模块的想法这实际上是一个ActiveSupport::Concern(concerns应该放在concerns文件夹中,concerns和helper模块最后都是模块,但每个模块的约定都不同,您将两种想法混合在一起,我想您想要的是一个helper模块,而不是关注点)Rails-v6.0.0.
组件
助手已经在每个Rails的所有视图中可用,包括所有视图中的所有助手。我同意
ActiveSupport::Concern
在这里没有任何业务–我想利用
包含的do
但是
Dir
循环从未运行来定义组件助手方法。在设置
config.action\u controller.include\u all\u helpers=false
后,我尝试在
ApplicationController
中手动包含helper,但手动包含并不是解决问题的方法。最新消息:这似乎是
Dir
的问题。使用数组文本动态定义方法
[:导航].每个{| name | define_method(name)…}
都可以正常工作。非常困惑为什么
Dir
在这种情况下会短路。