Пользовательский класс рефлекса стимула
Я работаю над экспериментальным проектом в Rails 6. Цель этого проекта для меня - изучить новые методологии и поиграть с новыми ("иш") технологиями.
Короче говоря, я играю с инфраструктурой Trailblazer, стимулом_reflex и view_component в сопровождении 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
. Уверенность в этом классе заложена в одной из жемчужин, но я не уверен, где ее найти. Я попытался переопределить некоторые методы в
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
1 ответ
Версия 2.3.5 из
view_component_reflex
ожидает, что имена классов компонентов заканчиваются на
Component
. Если они этого не сделают, это не удастся. См. https://github.com/joshleblanc/view_component_reflex/blob/v2.3.5/lib/view_component_reflex/engine.rb#L18
Поэтому попробуйте еще раз вызвать свой компонент:
Component::CounterCountComponent