Пользовательский класс рефлекса стимула

Я работаю над экспериментальным проектом в Rails 6. Цель этого проекта для меня — изучить новые методологии и поиграть с новыми технологиями.

Короче говоря, я экспериментирую с инфраструктурой Trailblazer, stimulus_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

person HermannHH    schedule 06.10.2020    source источник
comment
Попинговал автора ViewComponentReflex, может он посмотрит.   -  person Roland Studer    schedule 06.10.2020
comment
@HermannHH То, что вы делаете, должно просто работать, поэтому я думаю, что проблема здесь в первопроходце. Какую версию рефлекса компонента представления вы используете, и видите ли вы такую ​​ошибку, как Пытался инициализировать view_component_reflex на #{component_name}, но это не view_component_reflex в журнале?   -  person Cereal    schedule 06.10.2020
comment
@Зерновые Я использую view_component_reflex (2.3.5). К сожалению, я не вижу ошибки, о которой вы говорите, в моем лог-файле.   -  person HermannHH    schedule 06.10.2020
comment
Я думаю, что нашел проблему, вы можете отправить ее в репозиторий github.   -  person Roland Studer    schedule 08.10.2020


Ответы (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
person Roland Studer    schedule 08.10.2020