Ajouter un formulaire à un plugin

Je crée un plugin simple qui

  • ajoute un formulaire au-dessus de la chronologie du sujet
  • envoie l’adresse e-mail saisie par l’utilisateur à un contrôleur

Le formulaire est rendu au-dessus de la chronologie, mais lorsque je saisis un e-mail et que je clique sur le bouton de soumission, j’obtiens cette erreur dans la console du navigateur :

DEBUG: -------------------------------
vendor.js:49192 DEBUG: Ember  : 3.15.0
vendor.js:49192 DEBUG: jQuery : 3.6.0
vendor.js:49192 DEBUG: -------------------------------
vendor.js:4180 [Violation] 'setTimeout' handler took 489ms
[Violation] Forced reflow while executing JavaScript took 35ms
vendor.js:49192 DEBUG: For more advanced debugging, install the Ember Inspector from https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi
user-presence.js:77 [Violation] 'setInterval' handler took 51ms
vendor.js:49170 Uncaught Error: Assertion Failed: <@ember/component:ember716> had no action handler for: lonerWatch
    at assert (vendor.js:49170)
    at Class.send (vendor.js:44642)
    at Class.superWrapper [as send] (vendor.js:43919)
    at Class.send (plugin-connector.js:75)
    at Class.superWrapper [as send] (vendor.js:43919)
    at vendor.js:22103
    at instrument (vendor.js:50635)
    at vendor.js:22102
    at Backburner._run (vendor.js:67048)
    at Backburner._join (vendor.js:67024)

Le code (actuellement incomplet) est :

/assets/javascripts/discourse/templates/connectors/topic-navigation/loner-watch-topic-form.hbs

<form {{action 'lonerWatch' content on='submit'}}>    
    <p>Enter your email address to watch this topic for updates</p>
    <input name="email" placeholder="Your email"/>
    <button>Watch</button>
</form>

/assets/javascripts/discourse/controllers/loner-watch-topic-form.js.es6

export default Ember.Controller.extend({
    actions: {
      lonerWatch(content) {
        console.log(content);
      }
    }
  });

/controllers/loners_controller.rb

class LonersController < ApplicationController
   [...]
    # Watch topic as a staged user
    def watch
      user = ensure_user
      topic = Topic.find(params[:topic_id].to_i)
      TopicUser.change(user, topic.id, notification_level: params[:notification_level].to_i)
    end
  end

Je suis sûr qu’il me manque quelque chose de simple, mais je ne le vois pas. Toute aide est appréciée.

Je viens de remarquer que /assets/javascripts/discourse/controllers devrait être /assets/javascripts/discourse/components. Malheureusement, j’ai toujours la même erreur.

Je suis bloqué. Quelqu’un a-t-il une idée de ce que je fais mal ici ?

Le modèle de connecteur et le fichier JS doivent se trouver dans le même répertoire et porter le même nom. Donc
/assets/javascripts/discourse/connectors/topic-navigation/loner-watch-topic-form.hbs

<form {{action 'lonerWatch' content on='submit'}}>    
    <p>Entrez votre adresse e-mail pour suivre ce sujet pour les mises à jour</p>
    <input name="email" placeholder="Votre e-mail"/>
    <button>Suivre</button>
</form>

et
/assets/javascripts/discourse/connectors/topic-navigation/loner-watch-topic-form.js

export default {
  actions: {
    lonerWatch(content) {
      console.log(content);
    },
  },
};

Votre action devrait alors fonctionner. Vous pouvez en lire un peu plus ici si cela vous intéresse.

Merci pour votre réponse. Cela fonctionne maintenant. Il semble que j’avais plusieurs choses qui n’allaient pas, mais le pire était d’utiliser par erreur Ember.Controller.extend alors qu’il n’était pas nécessaire.