IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Slim est buggé !


Sujet :

Ruby on Rails

  1. #1
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut Slim est buggé !
    Et probablement également HAML
    en faisant un test de validation sur w3c, j'ai eu cette surprise

    Ma "view" en Slim

    Je génère une liste, mais slim ne met pas la balise fermante </ul> au bon endroit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @@index
    h1 Pages
    -if @pages.any?
      ul.pages
      - @pages.each do |page|
    		== slim :page, :locals => {page: page}
    - else
      p No pages here!
    Le code généré en HTML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        <!DOCTYPE html>↩
        <html>↩
           <head>↩
              <title>Simple CMS: Page List</title>↩
              <link href="./styles/main.css" rel="stylesheet" />↩
           </head>↩
           <body>↩
              <div id="admin">↩
                 <nav>↩
                    <ul>↩
                       <li><a class="round button" href="/pages">Pages</a></li>↩
                       <li><a class="round button" href="/pages/new">Add a page</a></li>↩
                    </ul>↩
                    <a class="rounded button" href="/logout">Log Out</a>↩
                 </nav>↩
              </div>↩
              <h1 class="logo"><a href="/pages">Simple Sinatra CMS</a></h1>↩
              <h1>Pages</h1>↩
              <ul class="pages"></ul>↩
              <li><a href="/pages/57c0e23d93c3693ee7e3ef58">Markdown Page</a></li>↩
              <li><a href="/pages/57c0e92393c3693ee7e3ef59">Ma premiere page</a></li>↩
              <li><a href="/pages/57c0f39b93c3691c01fa4844">page 3</a></li>↩
           </body>↩
        </html>

  2. #2
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Il faut indenter d'un tab (2 spaces) cette partie de ton code en dessous de 'ul' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ul
      - @pages.each do |page|

  3. #3
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Première fois que j'entend parlé de cette astuce. Et la plupart des Template qui n'ont pas d’opérateur fermant (à défaut de meilleur terme) échoue le test sur les listes. Est-ce que je peux savoir ou tu as débusquer cette astuce ?

  4. #4
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Il suffit juste de consulter la documentation de slim language. Il y a pleins exemples et explications. Il faut savoir que Slim est bien 'sensible' à la tabulation.

  5. #5
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Javix Voir le message
    Il suffit juste de consulter la documentation de slim language. Il y a pleins exemples et explications. Il faut savoir que Slim est bien 'sensible' à la tabulation.
    Tout comme python. Et j'ai horreur de cet aspect. Et cela illustre le problème. Puisque que le code était un copie-collé d'un exemple. Et je comprenais pas l'origine du problème, puisque l'exemple avait été fait par un professionnel.

    À ta connaissance, est-ce qu'il existe quelque chose de comparable en ERB:

  6. #6
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Le code
    n'a rien à voir avec ERB ni Slim, - c'est une méthode de Module Enumerable, elle est également disponible sur un objet de ActiveRecord::Relation

  7. #7
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Javix Voir le message
    Le code
    n'a rien à voir avec ERB ni Slim, - c'est une méthode de Module Enumerable, elle est également disponible sur un objet de ActiveRecord::Relation
    C'est bon à savoir. Malheureusement cela fait que ma solution n'en est pas une. S'il la base de donnée est vide cela ne fonctionnera pas. Si la base de donnée ne me retourne rien, j'aurais sans doute un message m'indiquant que cette méthode n'existe pas pour Nil.

    Il y a un tas de démo sur github qui plantent s'il n'existe pas au moins un élément dans la base de donnée. Ce serait bien s'il y avait une façon élégante de gérer ce cas de figure et d'écrire un message indiquant qu'il n'y a aucun élément dans la base de donnée, J'ai vu une solution utilisant rescue, mais je ne sais pas si c'est une bonne façon de gérer ce type de cas de figure.

    J'ai vu un script qui utilisait =|| [] à l'intérieur de l'itérateur d'un each afin d'éviter un crash, malheureusement je ne l'ai pas noté. Peut-être que cela t'es familier avec son utilisation.

  8. #8
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Ca dépend quelle requête est utilisée dans ton controller. Si elle retourne un type d'objet ActiveRecord::Relation, elle ne retournera jamais nil s'il n'y a aucun enregistrement dans la DB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    todo_app git:(master) ✗ rails c --sandbox
    Loading development environment in sandbox (Rails 5.1.4)
    Any modifications you make will be rolled back on exit
    2.4.0 :001 > Article.count
       (0.1ms)  SELECT COUNT(*) FROM "articles"
     => 10 
    2.4.0 :002 > Article.delete_all
      SQL (0.6ms)  DELETE FROM "articles"
     => 10 
    2.4.0 :003 > Article.count
       (0.1ms)  SELECT COUNT(*) FROM "articles"
     => 0 
    2.4.0 :004 > Article.all
      Article Load (0.2ms)  SELECT  "articles".* FROM "articles" LIMIT ?  [["LIMIT", 11]]
     => #<ActiveRecord::Relation []> 
    2.4.0 :005 >
    Donc tu auras une collection vide -> [].
    Dans ta View, lorsque tu vas boucler sur cette collection (par exemple sur celle des articles):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @articles.each do |article|
      # faire qch avec article
    end
    il n'y aura aucune erreur. Tu peux lire plus sur ActiveRecord Query Inteface dans Rails Guides. Rails a déjà 13 ans sur le marché des frameworks Web et ils ont pensé presque à tout.

  9. #9
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    J'ignore si cette méthode est disponible sous Sinatra, mais je vais le vérifier. En tous les cas, je vais en prendre bonne note, parce que cette méthode n'a pas l'air d'être très connue. J'ai plusieurs livres sur Ruby et Sinatra, et cette méthode ne fait pas partie des démos que j'ai analysé.

    Finalement j'ai retrouver l'astuce pour sécuriser les templates, en tentant plusieurs combinaison d' écriture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    z= nil
    (z||= []).each  do |x|
    	puts x
    end
    Je sais que mettre de la logique dans les templates n'est pas conseiller. Mais je pense que l'exception est acceptable, puisque cela permet de faire fonctionné le programme sans que la base de donnée soit en marche.

  10. #10
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Comme je l'avais dit, ActiveRecord::Relation fait partie de framework Rails. Si tu utilises ActiveRecord dans ton application Sinatra, tu n'auras qu'à déclarer ce gem dans Gemfile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gem 'activerecord'
    l'importer cette module dans ta class de modèle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    require 'active_record'
     
    class Post < ActiveRecord::Base
    end
    Tu peux lire plus d'info sur l'utilisation de Activerecord avec Sinatra ici

  11. #11
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Merci, sans le lien, j'aurais pataugé pendant un bon temps.

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  2. Le noyau UNIX de MAC OS X est-il buggé ?
    Par sinfoni dans le forum C
    Réponses: 9
    Dernier message: 28/06/2010, 10h31
  3. La commande find de Solaris est-elle buggée ?
    Par verbose dans le forum Solaris
    Réponses: 1
    Dernier message: 19/03/2010, 18h25
  4. tout ce que je telecharge est buggé
    Par gusgus dans le forum Internet
    Réponses: 24
    Dernier message: 19/09/2006, 19h35
  5. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 13h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo