Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

Tag - ruby

Fil des billets

mercredi 19 août 2015

Comment connaitre les changements qu'il y a eu sur un objet ActiveRecord immédiatement après un save ?


Avant de faire un save il est possible de connaitre les changements/savoir si un objet ActiveRecord a changé en appelant .changes ou changed?
Mais après un save ces fonctions renvoient respectivement [] et false. Il existe néanmoins la méthode previous_changes qui va renvoyer un hash avec la liste des attributes changés ainsi que leurs valeurs précédentes et actuelles.

mercredi 17 juin 2015

Comment ne plus utiliser le default_scope ?

Le default_scope est un scope qui est appelé implicitement à chaque requête ActiveRecord sur le modèle en question.

Le problème c'est qu'on l'oublie vite celui-là... Vaut mieux l'utiliser quand on a de bonnes raisons (un order systèmatique)...

En cas de nécessité absolu de ne pas utiliser le default_scope (c'est là qu'on doit légitimement se poser des questions, hein), il existe une méthode : unscoped. Elle vire tous les scopes précédemment utilisés, donc attention à l'ordre dans lequel vous le chaînez.

Documentation officielle sur ces deux méthodes : http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-default_scope

vendredi 5 juin 2015

Commentaire multiligne en Ruby

Je me souviens avoir cherché, il y a quelques temps sans jamais avoir trouvé une réponse qui fonctionne. Un peu la honte après 5-6 ans de Ruby... Heureusement que ça ne tue pas la honte ^^.

=begin

def une_methode_en_commentaire

  puts "Bidule"

end

=end

La petite subtilité que je n'avais peut-être pas saisi à l'époque est qu'il ne faut pas mettre d'espace avant les "=" sinon ça ne fonctionne pas !

mardi 14 avril 2015

Utiliser Meld sous linux pour voir un diff git sur un fichier local avec sa précédente version.

L'article d'origine est situé ici : https://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy

Je me permets ici juste d'écrire le bout de script en ruby au lieu de python (attention c'est d'une grande complexité ^^).

Donc pour résumer l'article, il faut écrire un script qui renvoie deux paramètres au lieu de sept.

nano /home/sylvain/diff.rb

Mettre les deux lignes ci-dessous dans le script (attention il s'agit d'anti-quote) :

#!/usr/bin/env ruby

`meld #{ARGV[0]} #{ARGV[1]}`

sudo chmod +x /home/sylvain/diff.rb

git config --global diff.external /home/sylvain/diff.rb

git diff monfichier.rb

Ça permet quand même d'avoir un diff plus visuel.

vendredi 30 janvier 2015

Sprockets::FileNotFound in Beautiful#dashboard : couldn't find file 'jquery.ui.all'

Pour corriger l'erreur Sprockets::FileNotFound in Beautiful#dashboard : couldn't find file 'jquery.ui.all' dans une application qui utilise beautiful_scaffold il faut remplacer (dans application-bs.js et application-bs.css) : 

= require jquery.ui.all 

Par  

= require jquery-ui

Bon code.

mercredi 28 janvier 2015

MiniMagick Composite : composition de deux images en préservant la transparence

J'ai joué un peu avec MiniMagick ces derniers temps. Je cherchais à faire une composition de deux images en préservant la transparence.

Après quelques heures de recherche et de test, je me suis mis à tester image magick en ligne de commande. J'avais vraiment un exemple minimaliste et en ligne de commande, ça fonctionnait : la transparence était conservée. 

Fatigué de la différence en mini_magick et image magick j'ai lu le code source de mini_magick et je suis tombé sur ça : 

https://github.com/minimagick/minimagick/blob/master/lib/mini_magick/image.rb#L427

Tiens mais on peut spécifier un format dans la méthode composite (après coup j'ai un peu honte c'était dans la doc : http://www.rubydoc.info/github/minimagick/minimagick/MiniMagick/Image) le fait de choisir png en format de sortie, minimagick va conserver la transparence.

Bref voici un exemple concret (vous noterez la qualité et la précision de mes peintures numériques ^^) :


require 'mini_magick'
# composite -compose Dst-Over -gravity Center fond.png pochoir.png test.png
image = MiniMagick::Image.open("pochoir.png")
image2 = MiniMagick::Image.open("fond.png")
result = image.composite(image2, 'png') do |c|
c.compose "dst-over"
c.gravity "Center"
end
result.write("result.png")

vendredi 11 avril 2014

Comment j'aurai dû gagner un samsung galaxy S5 avec materiel.net et twitter !

Tous les midi, materiel.net (merci à eux) lance un concours : trouver une vignette parmi les pages de leur site. 

Pourtant chaud-bouillant, tous les midi, je me fais battre à plates coutures. Ce midi j'étais plus que jamais en feu :-) je trouve relativement rapidement la page et la tweet avec mention mais materiel.net annonce un autre vainqueur, pas très bon joueur je regarde le tweet. Je trouve cela vexant alors je cherche comment comparer la date de deux "status" twitter.

J'écris un petit script ruby pour obtenir les secondes sur les dates des status (les clés à l'API sont vides volontairement) :

require 'rubygems'
require 'twitter'
client = Twitter::REST::Client.new do |config|
config.consumer_key        = ""
config.consumer_secret     = ""
config.access_token        = ""
config.access_token_secret = ""
end
moi = '454563567547973632'
lautre = '454563662246989824'
#https://twitter.com/sylperso/status/454563567547973632
#https://twitter.com/le_matt/status/454563662246989824
puts "Moi =>"
puts client.status(moi).attrs
puts "L'autre =>"
puts client.status(lautre).attrs

Réponse du script :

Moi =>

{:created_at=>"Fri Apr 11 10:16:14 +0000 2014", :id=>454563567547973632, :id_str=>"454563567547973632", :text=>"@materielnet http://t.co/txZGEs7zKA", :source=>"web", :truncated=>false, :in_reply_to_status_id=>nil, :in_reply_to_status_id_str=>nil, :in_reply_to_user_id=>47565953, :in_reply_to_user_id_str=>"47565953", :in_reply_to_screen_name=>"materielnet", :user=>{:id=>1926957248...

L'autre =>

{:created_at=>"Fri Apr 11 10:16:37 +0000 2014", :id=>454563662246989824, :id_str=>"454563662246989824", :text=>"@materielnet hop !  http://t.co/O2ZIXBpq8W", :source=>"web", :truncated=>false, :in_reply_to_status_id=>454562669815558144, :in_reply_to_status_id_str=>"454562669815558144", :in_reply_to_user_id=>47565953, :in_reply_to_user_id_str=>"47565953", :in_reply_to_screen_name=>"materielnet", :user=>{:id=>15720056...

Donc en constatant ces résultats, je fais part de ma recherche avec le community manager de materiel.net qui m'explique que je n'apparais pas dans leur timeline.

Mon tweet mention s'apparente à une réponse (en tout cas à l'utilisateur voir le JSON en gras), de plus ensuite j'ai voulu assurer le coup en faisant après une réponse au status et là twitter considère que j'ai déjà tweeté ça (donc je laisse tombé considérant que c'est bien pareil), vous pouvez essayer vous verrez :

Donc en conclusion, twitter considère qu'un tweet avec mention et pareil qu'une réponse (message "déjà tweeté") mais pas materiel.net, donc je ne sais pas qui est en faute :

Twitter qui a fait un uniqueness scopé par user et non sur user + in_reply_to_status_id 

Materiel.net qui n'a pas d'outil pour récupérer toutes les mentions à partir d'un timestamp

Je n'ai que mes yeux pour pleurer, d’ailleurs question suivante : Est-ce que faire RT c'est pareil que cliquer sur "Retweeter" ?

Voici les status :

https://twitter.com/sylperso/status/454563567547973632

https://twitter.com/le_matt/status/454563662246989824

- page 2 de 16 -