Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

Beautiful-Scaffold : content_for :head et PJAX script et style

Date d'édition 2012-03-16 à 10:07

Beautiful-Scaffold utilise PJAX : Ajax avec PushState. Le problème est que lorsque l'on veut ajouter un script/style dans une page on se retrouve bloqué le content_for ne fait pas son boulot (normal car il n'y a pas de render de layout).

La solution consiste a les mettre dans la vue :

<% headcontent = capture do %>
  <style>
    .i-love-css{
      font-size:42px;
    }
  </style>
<% end %>
<% if request.headers['X-PJAX'] then %>
  <%= headcontent %>
<% else %>
  <% content_for :head do %>
    <%= headcontent %>
  <% end %>
<% end %>

Bon et sinon si vous n'avez pas le choix : une balise qui doit obligatoirement être dans le layout et bien il suffit d'ajouter la class "nopjax" dans le lien pour signaler à pjax de ne pas faire de requête en AJAX.

content_for et yield ou capture

Date d'édition 2012-02-23 à 10:36

Comme d'habitude on vient me demander de changer des choses sur les interfaces au travail, comme d'habitude je cherche le compromis entre Ergonomie / Performance / Fainéantise. 

J'avais une liste d'utilisateurs, je boucle donc sur ceux-ci et j'affiche des stats en bas de la liste (là c'est la Fainéantise qui prend le pas, et puis les performances un peu car sinon il aurait fallu faire une deuxième boucle)...). On revient me voir pour le dire c'est cool mais c'est mieux en haut. Là je me dis c'était à prevoir, comment faire ? C'est là qu'intervient content_for (enfin non en fait lisez la suite...). Il m'arrive de l'utiliser pour dire à ma vue d'envoyer des données dans le layout donc je me suis dit que ça marcherait aussi comme ça !

Voici un exemple :

<%= yield(:mazone) %>
<p>PARAGRAPHE</p>
<% content_for :mazone do %>
  <p>Ceci est un paragraphe au dessus de PARAGRAPHE</p>
<% end %>

Bon c'est pas la peine d'essayer ça ne marche pas ! On ne peux pas utiliser content_for dans la même vue / page. En fait la solution consiste à utiliser capture (c'est un helper de rails) : voici donc comment faire :

<% @paragraphe = capture do %>
  <p>PARAGRAPHE</p>
<% end %>
<p>Ceci est un paragraphe au dessus de PARAGRAPHE</p>
<%= @paragraphe %>

Ca fonctionne à l'envers de ce que je voulais faire mais le résultat est là !

Les objets ruby sont passés en référence ou en valeur dans les méthodes ?

Date d'édition 2012-02-17 à 08:13

Bon à la suite d'une discussion avec BobMaerten et PagedeGeek, voici le fruit de mes recherches (merci c'est plus clair dans ma tête :-)

Donc en fait les integer sont traités différemment pour les problèmes de performance. Tous les objets Ruby sont passés par références. Le cas particulier des integers c'est que le pointeur est la valeur (pour des problèmes de performance). object_id n'est pas le pointeur, ce n'est qu'un identifiant unique de l'objet.

(https://www.ruby-forum.com/topic/41160#8333)

Voilà la source de la confusion (comportement différent avec des entiers et des tableaux) :

1.8.7 :001 > monentier = 4
 => 4 
1.8.7 :002 > monentier.object_id
 => 9 
1.8.7 :003 > def modif(v)
1.8.7 :004?>   v += 1
1.8.7 :005?>   end
 => nil 
1.8.7 :006 > modif(monentier)
 => 5 
1.8.7 :007 > monentier
 => 4 
1.8.7 :008 > monentier.object_id
 => 9 
1.8.7 :009 > monarray = [2,3,4]
 => [2, 3, 4] 
1.8.7 :010 > def modif2(v)
1.8.7 :011?>   v << 5
1.8.7 :012?>   end
 => nil 
1.8.7 :013 > monarray
 => [2, 3, 4] 
1.8.7 :014 > monarray.object_id
 => 70092968297200 
1.8.7 :015 > modif2(monarray)
 => [2, 3, 4, 5] 
1.8.7 :016 > monarray
 => [2, 3, 4, 5] 
1.8.7 :017 > monarray.object_id
 => 70092968297200 
1.8.7 :018 > 

Un peu de lecture sur le sujet : https://www.ruby-forum.com/topic/41160

https://khelll.com/blog/ruby/ruby-pass-by-value-or-by-reference/

Blog de BobMaerten et de PagedeGeek

Appeler une classe à partir d'une chaine de caractère en ruby

Date d'édition 2012-02-15 à 10:12

Vous avez par exemple une classe Product, vous voudriez l'appeler à partir d'une chaine. Voici le bout de code qui vous permettra de le faire :

"product".classify.constantize

"admin_product".classify.constantize

Du coup vous pouvez faire :

"product".classify.constantize.where(:name => "Produit 1").first

Ca peut-être bien pratique. Bon code.

Liste des TimeZone de RubyOnRails

Date d'édition 2012-02-10 à 14:22

Voilà la commande magique qui renvoie la liste des TimeZone de Rails :

ActiveSupport::TimeZone.all

Si vous voulez les afficher en console :

ActiveSupport::TimeZone.all.map(&:tzinfo).each{ |tz|  puts tz  }

Si vous voulez changer la TimeZone de ruby pour Casablanca (Maroc, Afrique): 

Time.zone = "Casablanca"

Pour vérifier :

Time.zone

Ou Paris :

Time.zone = "Paris"

Time.zone

Pour la changer dans rails : 

Rails.configuration.time_zone = "Paris"

Bon code.

Développement ruby et geekeries - rivsc