我正在Rails 6中进行一个实验项目。对我来说,这个项目的目的是学习新的方法和方法;玩新技术。
简而言之,我在开拓者的基础设施上打球,stimulus_reflex&view_component_reflex。
据我所知,StimulusReflex
&ViewComponentReflex
期望反射类驻留在reflexes
文件夹/命名空间中。
我正在努力实现的目标:
将我的ViewComponentReflex
组件嵌套在Trailblazer
概念文件夹(命名空间(中。
我尝试过的:
创建了以下文件夹结构:
concepts/post/component/counter.rb
class Component::Counter < ApplicationComponent
def initialize
@loading = false
end
def loading=(new_value)
@loading = new_value
refresh! '#loader'
end
def do_expensive_action
prevent_refresh!
self.loading = true
wait 20
self.loading = false
end
end
concepts/post/component/counter/counter.html.erb
<%= component_controller do %>
<div id="loader">
<% if @loading %>
<p>Loading...</p>
<% end %>
</div>
<button type="button" data-reflex="click->Component::Counter#do_expensive_action" >Load Content</button>
<% end %>
预期结果:
我希望Rails允许使用名称空间等。当设置上述&在运行一个示例应用程序时,我得到了错误:uninitialized constant Component::CounterReflex
。这个类的依赖是内置在其中一个gem中的,但我不确定在哪里可以找到它。我尝试过在ViewComponentReflex
中重写一些方法,但没有成功。
当我将Component::Counter
移到components
文件夹(如本例所示(时,代码就可以工作了。
有没有任何方法可以使用这个堆栈重新定义/配置反射类的路由(模块(?
更新:
我的应用程序的GitHub存储库可以在这里找到
当按下计数器按钮时,我看到的确切错误信息是:
StimulusReflex::Channel is streaming from StimulusReflex::Channel
06:48:27 log.1 | StimulusReflex::Channel#receive({"target"=>"Component::Counter#do_expensive_action", "args"=>[], "url"=>"http://krated.test/", "attrs"=>{"type"=>"button", "data-reflex"=>"click->Component::Counter#do_expensive_action", "data-key"=>"6b36d7d05b8737b0328d19bd2fff2679901b1736bb9e242b128e3b715aba6e87", "data-controller"=>"stimulus-reflex", "data-action"=>"click->stimulus-reflex#__perform", "checked"=>false, "selected"=>false, "tag_name"=>"BUTTON", "value"=>""}, "dataset"=>{"data-reflex"=>"click->Component::Counter#do_expensive_action", "data-key"=>"6b36d7d05b8737b0328d19bd2fff2679901b1736bb9e242b128e3b715aba6e87", "data-controller"=>"stimulus-reflex", "data-action"=>"click->stimulus-reflex#__perform"}, "selectors"=>[], "reflexId"=>"a091247b-d53b-4e63-ac59-78c72c4a3cb1", "permanent_attribute_name"=>"data-reflex-permanent", "params"=>{}})
06:48:27 log.1 | StimulusReflex::Channel Failed to invoke Component::Counter#do_expensive_action! http://krated.test/ uninitialized constant Component::CounterReflex /Users/hermann/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb:284:in `const_get
view_component_reflex
的2.3.5版本要求组件类名以Component
结尾。如果他们不这样做,它就会失败。看见https://github.com/joshleblanc/view_component_reflex/blob/v2.3.5/lib/view_component_reflex/engine.rb#L18
因此,请再次调用您的组件:
Component::CounterCountComponent