En ruby, quand tu fais un héritage et que tu ré-implémentes une méthode, ça écrase la méthode mère. Dans cas, si tu fais ExoDiscriminant.new.result_valid? c'est bien ExoDiscrimant#result_valid? qui va être appelé et non Exo#result_valid? Transfères toute la logique dans le modèle. Ne laisse rien dans le contrôleur. Tu peux utiliser le paradigme "fat model skinny controler". Dans d'autres cas, il aurait été mieux de faire des "services objects" ou des "form objects" mais dans ce cas je crois que ce n'est pas approprié. Tu peux bouger le helper correspondant à la classe. Dans la classe ExoDiscriminant tu peux bouger DiscriminantHelper.

Ceci dit, dans ce cas précis je pense que faire un héritage c'est bien mais en général, c'est mieux de faire de la composition. Tu peux chercher "composition over inheritance" si tu veux.



Le 2015-04-15 18:08, Philippe Demaria a écrit :
Je vois ce que tu veux dire mais il y a une validation pour chaque exo.
Donc la méthode   def result_valid? n'est pas unique.

Donc je ne peux rien mettre dedans

def result_valid?
# Ta méthode validate dans ton contrôleur. Je garde alors mon controller avec la méthode dedans. c'est ça ?
/end /
/
/
/  def enunciated/
/   # Même chose que dans ton helper. /Lequel ? J'ai un helper par exo !
/  end/



Le mercredi 15 avril 2015 11:47:01 UTC-5, Guirec Corbel a écrit :

    Je vais te donner un exemple potentiel (non testé) pour ton code.

    class ExoDiscriminant
      include Mongoid::Document
      include Mongoid::Timestamps

      field :title, type: String
      field :text, type: String
      field :help, type: String
      field :time, type: Integer
      field :reponseStudent, type: Integer
      field :a, type: Integer
      field :b, type: Integer
      field :c, type: Integer
      field :d, type: Integer

      validates :title, presence: true
      validates :text, presence: true
      validates :time, presence: true
      validates :help, presence: true
      validates :reponseStudent, presence: true, on: :validation

      validate :valid_answer, on: :update
      def valid_answer
        errors.add(:anwser, "Réponse fausse") unless result_valid?
      end

      def result_valid?
        # Ta méthode validate dans ton contrôleur.
      end

      def enunciated
       # Même chose que dans ton helper.
      end
    end

    À partir de ça, dans ton contrôleur, tu n'a juste a changer la
    classe instanciée. Tu peux ensuite utiliser la méthode
    @exo.enunciated dans ta vue, à la place de ton helper.

    Avec l'héritage tu auras une base comme ceci :

    class Exo
      # ...

      def result_valid?
        # une validation par défaut si tu en a
      end
      def enunciated
        # un énoncé par défaut si tu en a
       end
    end

    et des classes enfants comme ceci :

    class ExoDiscriminant < Exo
      def result_valid?
         # Validation spécifique pour les discrimiants
      end

      def enunciated
        # Énoncé spéfique
      end
    end

    Est-ce que tu vois ce que je veux dire ?

    Le 15 avril 2015 12:34, Philippe Demaria <demaria....@lfbogota.com
    <javascript:>> a écrit :

        Justement, je ne voudrais pas passer par le stockage en bdd.
        les exercices étant alétoires, je ne veux pas utiliser
        d'enregistrement en base de données. Comme cela avec un type
        d'exo, j'ai une infinité d'exo.
        Je vais potasser ton tuto rails : samurails.
        Mais comme je vais avoir à peu près 1000 types d´exo
        différents, j'essaie tout de suite de partir bien.....

        Je ne comprends pas trop  ton idée :
        /D'après ce que je comprend, tu as uniquement le helper et la
        validation qui change/. OUI
        /La première chose à faire, ça serait de ramener ces deux
        éléments dans le modèle/. Dans quel model ?
        /Ta vue, ton controlleur et ton helper seront donc tous les
        même. /Comment peuvent ils être les mêmes ?

        Je dois un "peu" potasser.....


        Le mercredi 15 avril 2015 09:26:12 UTC-5, Guirec Corbel a écrit :

            Apparemment oui mais la solution est variables car les
            variables ( au sens mathématique ) sont aléatoires. Les
            solutions doivent donc êtres calculées.

            Ça serait possible de stocker la formule dans la base de
            données et de l’exécuter en faisant une interpolation des
            variables. Si le chaîne "@a + @b - @c" est stockée, tu
            peux faire un eval de cette chaîne pour vérifier le
            résultat avec les variables. Je pense que ça peut fonctionner.

            Le 15 avril 2015 10:20, thierry henrio
            <thierry...@gmail.com> a écrit :

                2015-04-15 16:02 GMT+02:00 Philippe Demaria
                <demaria....@lfbogota.com>:

                    Voici les fichiers pour le calculs de relatifs par
                    exemple.
                    le model est le même

                Est-ce qu'un exercice a une seule solution ?

                ?, Thierry
-- -- Vous avez reçu ce message, car vous êtes abonné au
                groupe "Railsfrance" de Google Groups.
                Pour transmettre des messages à ce groupe, envoyez un
                e-mail à l'adresse rails...@googlegroups.com
                Pour résilier votre abonnement envoyez un e-mail à
                l'adresse railsfrance...@googlegroups.com
                ---
                Vous recevez ce message, car vous êtes abonné au
                groupe Google Groupes "Railsfrance".
                Pour vous désabonner de ce groupe et ne plus recevoir
                d'e-mails le concernant, envoyez un e-mail à l'adresse
                railsfrance...@googlegroups.com.
                Pour obtenir davantage d'options, consultez la page
                https://groups.google.com/d/optout
                <https://groups.google.com/d/optout>.


-- -- Vous avez reçu ce message, car vous êtes abonné au groupe
        "Railsfrance" de Google Groups.
        Pour transmettre des messages à ce groupe, envoyez un e-mail à
        l'adresse rails...@googlegroups.com <javascript:>
        Pour résilier votre abonnement envoyez un e-mail à l'adresse
        railsfrance...@googlegroups.com <javascript:>
        ---
        Vous recevez ce message, car vous êtes abonné au groupe
        Google Groupes "Railsfrance".
        Pour vous désabonner de ce groupe et ne plus recevoir
        d'e-mails le concernant, envoyez un e-mail à l'adresse
        railsfrance...@googlegroups.com <javascript:>.
        Pour obtenir davantage d'options, consultez la page
        https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>.


--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse railsfrance@googlegroups.com Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscr...@googlegroups.com
---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Railsfrance". Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com <mailto:railsfrance+unsubscr...@googlegroups.com>. Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Répondre à