Développeur Web RoR

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

mardi 27 mai 2014

Rajouter des balises avant et après la sélection dans RubyMine (Surround with)

Dans RubyMine -> File -> Settings -> Live Templates (IDE Settings) vous pouvez créer votre code à générer (Un bout de code dont vous vous servez beaucoup, un peu comme une extension du ZenCoding ou Emmet). 

Dans Cliquez sur le "+" puis "1. Live Template", choisissez une abréviation qui permettra de la retrouver par exemple "ddd" sans les "". Dans la description, dévrivez votre Live Template. Dans "Template text" mettez votre code :

<div>$SELECTION$</div>

$SELECTION$ représente la sélection courrante (cela permettra d'ajouter du code autour de la sélection). Si le message en rouge en dessous affiche "No applicable contexts yet. Define" Cliquez sur "Define" pour définir dans quel contexte utiliser le Live Template. Dans ce cas cochez ERB et HTML.

Enfin "Apply" -> "Ok", RubyMine a tendance à être un peu perdu donc redémarrez-le.

Donc maintenant avec ctrl + espace vous devriez pouvoir utiliser votre Live Template (par son abréviation) mais la sélection sera écrasée. Il faut alors sélectionner son texte puis utiliser ctrl + alt + j.

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

vendredi 7 février 2014

Transformer un array d'objet ActiveRecord en hash avec comme clé l'id et l'objet en valeur

La petite astuce du jour :

Comment transformer un Array d'objet ActiveRecord en Hash avec comme clé l'id et l'objet en valeur ?

Solution

Hash[Family.all.map{ |f| [f.id,f] }]

Ce qui donne : 

{

     4: #<Family id: 4>,

     5: #<Family id: 5>,

     6: #<Family id: 6>,

}

De rien :-)

mercredi 22 janvier 2014

"Replace in path" avec des regexp dans RubyMine (jetbrains editor)

Il peut être pratique de faire un "remplacer" dans une liste de fichier.

Dans RubyMine -> Edit -> Find -> Replace In path :

Il faut cocher "Regular expression", ensuite dans "Text to find" mettez votre code avec la/les regexp :

<td><%= ([a-z]*)\.id %></td>

Qui matcherait <td><%= product.id %></td> par exemple.

Dans "Replace with" : 

<td><i class="icon-info-sign" title="<%= $1.id %>"></i></td>

Qui remplacerait l’occurrence trouvée par : <td><i class="icon-info-sign" title="<%= product.id %>"></i></td> grâce au $1. Il s'agit d'une "back reference".

Plus d'info ici : http://www.jetbrains.com/ruby/webhelp/find-and-replace-in-path.html

mardi 21 janvier 2014

Utiliser hstore avec le gem Apartment

Il m'est arrivé d'avoir besoin de hstore (stockage key/value dans postgres) avec Apartment.
La mise en place n'est pas très compliqué mais il ne faut rien oublier.
Le readme de Apartment est bien fait : https://github.com/influitive/apartment
Personnellement j'ai créé l'extension manuellement :

sudo -s -u postgres
psql
\c mabasededonnees
CREATE SCHEMA hstore; CREATE EXTENSION HSTORE SCHEMA hstore;

Ensuite il faut rajouter dans la config d'apartment :

Apartment.configure do |config|
  [...]
  config.persistent_schemas = ['hstore']
  [...]
end

Egalement dans le database.yml :

development:
  adapter: postgresql
  host: localhost
  database: mabasededonnees
  username: sylvain
  password: sylvain
  schema_search_path: "public,hstore"

La difficulté, ici c'est qui si vous faites un rake apartment:migrate ou rake db:migrate vous allez avoir une erreur :
PG::UndefinedObject: ERROR:  type "hstore" does not exist
Parce que l'extension n'a pas pour propriétaire "sylvain". Il faut donc retourner sur psql pour corriger le tir :

sudo -s -u postgres
psql
\c mabasededonnees
ALTER SCHEMA hstore OWNER TO "sylvain";

Le  "rake apartment:migrate" devrait mieux se passer maintenant.

vendredi 17 janvier 2014

Chainer ses méthodes sans redouter un "NoMethodError" ou "undefined method for NilClass" avec try

Il peut être pratique de faire un :

@voiture.roues.first.gonflage

Voiture étant un objet de la classe Voiture.

Roue est une classe et elle belongs_to Voiture

gonflage est un attribut de roue.

Ici pour arriver jusqu'à gonflage, on peut rencontrer plusieurs nil :

@voiture peut être nil. 

Si @voiture n'est pas nil, alors roues.first peut renvoyer nil.

Eh bien il existe un fonction try sur Object (méthode qui vient de Rails et non du Ruby pur) qui permet d'essayer d'appeler une méthode, sur la classe ou sur nil, de sorte que :

@voiture.try(:roues).try(:first).try(:gonflage) renverra soit la valeur de gonflage soit nil.

mercredi 15 janvier 2014

L'attribut form d'html5

Vous avez peut-être un jour souffert des formulaires en html. html5 introduit une nouveauté l'attribut form, celui-ci permet de placer les input/select/button partout dans votre page web et de leur associer à un formulaire.

<form id="monform">

</form>

<input type="text" form="monform" name="name" value="" placeholder="Votre nom">

Ça peut-être bien pratique croyez-moi.

- page 1 de 46