DRY in your views (RoR)

Excellent tutorial on how to DRY views in Ruby On Rails.

Developers tend to spend a lot of time refactoring their controllers and helpers, but once they get to the views (rhtml), more often than not, the DRY (Don’t Repeat Yourself) hat just disappears. This is not surprising, HTML markup by its very nature predisposes you to repetition of structural tags. However, in certain situations, a little Ruby magic can go a long way. Namely, you should get into the habit of creating block helpers to DRY up your views. Let’s take a look at the often (ab)used case of rounded corners.

…… follow the source to read more !

source

NetBeans : a great IDE for Ruby On Rails

Finally a great IDE to develop with Ruby On Rails : reformating, code completion, direct access to object definition and source, etc.

Ok, Rails c’est super cool et tellement puissant que l’IDE est de moindre importance que pour d’autres languages. Mais malgrĂ© tout, je suis sĂ»r que ça vous manquait de ne pas pouvoir aller d’un click sur le corps d’une mĂ©thode (surtout d’une API tierce), de re-formater votre code afin qu’il reste Ă  la fois beau et synchronisĂ© sur les CVS/SVN…

Et bien Sun Microsystem viens de donner un coup de pied dans la fourmilière:
regarder ces démos (surtout la 2) pour preuve:
http://blogs.sun.com/roumen/entry/two_demos_jruby_on_rails

Voilà tout est là: télécharger Netbeans 6 milestone 7 ici:
http://nbi.netbeans.org/m11/download.html

puis installer le plugin Ruby avec Module manager de Netbeans:
Tools > Update Center > Check the web for available modules > Next puis taper ‘r’ pour trouver Ruby dans la liste des modules Ă  tĂ©lĂ©charger.

Ensuite après avoir redĂ©marrĂ© Netbeans, on peut crĂ©er un nouveau projet Rails ou encore le crĂ©er Ă  partir d’un dossier source existant.

Voilà, ça ressemble à RadRails, mais:
* si on fait CTRL+click sur une méthode, on va à sa définition,
* si on fait CTRL+espace dans le code, on a l’auto-complĂ©tion,
* on peut reformatter le code Ruby;
* on peut apparemment refactorer du code,
* si on sélectionne une variable on voit ses occurrences dans le fichier,
* on peut aussi tourver les références dans le projet entier
* on Ă  l’aide RDoc dispo avec l’auto-complĂ©tion
* on peut lancer son serveur/navigateur avec F6

MoralitĂ©, Ă  ma connaissance aucun des IDE Rails que j’ai pu tester ne proposait tout cela (ni Textmate, ni Radrails, ni Emacs + plugin Rails, ni JEdit + plugin Rails, ni Scite)

Enfin, notĂ© que JRuby pourrait bientĂ´t Ă©galement ĂŞtre une excellente implĂ©mentation de Ruby pour Rails; En effet, le tout rĂ©cent JRuby 0.9.8 pass plus de 98% des tests de non rĂ©gression de Rails. C’est un peu plus lent que Ruby MRI (mais plus tant que ça) et surtout les dĂ©veloppeurs travaillent très dur Ă  la compilation Just In Time par la JVM Hotspot du code Ruby. D’ici quelques mois JRuby sera plus radide que MRI Ruby dans l’essentiel des benchs.

PS: troubleshooting: si Netbeans ne s’ouvre pas sur votre distro Linux avec Desktop 3D Beryl il suffit d’ajouter ces lignes dans votre fichier /etc/environment (puis redĂ©marrer votre session et Netbeans):

AWT_TOOLKIT="MToolkit"
export _JAVA_OPTIONS="-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAnd$

source

Captcha and openssl

If you want to use Captcha gem and got this error :

MissingSourceFile

no such file to load -- openssl
/usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:147:in `require'
/usr/lib/ruby/gems/1.8/gems/captcha-0.1.2/lib/captcha.rb:21
Soluce : sudo apt-get install libopenssl-ruby

In a general way, you need to install these packages to get captcah fully functionnal :

libopenssl-ruby libgd-ruby1.8

Methode : Getting Real

Vu sur simpleentrepreneur.com

Pour synthétiser, Getting Real c’est :

  1. Proposer moins de fonctionnalités : se concentrer seulement sur ce qui est important pour l’utilisateur et savoir lui dire non lorsqu’il le faut.
  2. S’autofinancer : être plus libre vis-à-vis d’investisseurs qui auront forcément des attentes bien précises. Cela oblige aussi à trouver des solutions pragmatiques qui doivent marcher tout de suite.
  3. Etre flexible : être capable de réagir positivement aux changements. Respecter dates et budget mais ne pas hésiter à repousser certaines fonctionnalités par manque de temps.
  4. Avoir un équipe réduite mais polyvalente : 3 personnes doivent pouvoir suffire dans la plupart des cas à lancer une première version d’un produit (mais il faut bien les choisir).
  5. Accepter pleinement les contraintes : oblige à être créatif.
  6. Ne pas se focaliser au début sur les détails : il y aura tout le temps nécessaire plus tard pour revenir dessus (d’autant plus que cela aura sûrement changé).
  7. Sortir une première version le plus tôt possible et la faire tester par les utilisateurs finaux : idéal pour obtenir un feedback pertinent et orienter le produit dans la bonne direction (celle des utilisateurs). Il faut travailler ensuite par itération pour le raffiner en ajoutant au fur et à mesure de nouvelles fonctionnalités.
  8. Travailler sans être interrompu : pour être plus productif et efficace, bloquer une partie de la journée pendant laquelle vous ne pourrez pas être dérangé (pas d’emails, de coups de téléphone, de messagerie instantanée, …)
  9. Ne plus faire de meetings : les meeting sont la plupart du temps contre productifs et il vaut mieux travailler à résoudre les problèmes en amont.
  10. FĂŞter chaque petite victoire : important pour la motivation.
  11. Commencer par mettre au point la maquette avant de coder : elle servira d’une part de spécification fonctionnelle, pourra être montré au client et permettra également de travailler tout de suite sur l’ergonomie du site et l’agencement de l’information.
  12. Designer d’abord les parties qui sont vraiment le coeur de la page : il faut délaisser les menus, en-têtes et autres éléments graphiques pour se focaliser sur ce qui est propre à chaque page. Le reste suivra.
  13. Ne pas faire d’interface d’administration : gagner du temps en incorporant des fonctionnalités d’administration directement dans l’interface utilisateur.
  14. Garder le code simple : écrire le moins de code possible et ne pas développer en pensant au futur. Il vaut mieux raffiner au fur et à mesure.
  15. Etre ouvert : permettre la création d’une communauté d’utilisateurs en ouvrant le produit grâce à une API et en communiquant au travers d’un blog.

Getting real integral method on line

Rails, Paginator et has_many associations

Par défaut, le mélange de ces 3 ingrédients ne fonctionne pas sous Rails.

La solution est lĂ  :

I dove into RoR Pagination yesterday (ActionController::Pagination), and while it’s great for paginating all data in a model, it really sucks for paginating data from an activerecord association (and by really sucks I mean doesn’t support).

Here’s the problem. Say I have a user who has a collection of photos:


class User < ActiveRecord::Base
has_many :photos, :conditions => 'photos.is_deleted = false', :order => 'photos.created_at DESC'

end

I want to have the ability to feed the user’s photos to the paginator. Unfortunately, the paginate function simply takes a collection id, and will not accept a set of data (an association, in this case). So, if I want to paginate photos on a user, I have to do this:


@photo_pages, @photos = paginate :photos,
:conditions => ["photos.user_id=? AND is_deleted = false", @user.id],
:order => "photos.created_at DESC"

What a mess. Now i’ve lost the benefits of my association, since I have to define the association as part of the pagination rules. Very suprised Rails handles things this way, as it seems to violate the basic DRY principles. Anyways, I only had to write code like this a few times to realize how much of a pain in the ass it is, and I created a “paginate_association” method to help me out.


def paginate_association(object, assoc_name, find_options = {}, per_page = 10)
page = (params[:page] || 1).to_i

item_count = object.send(assoc_name.to_s + '_count')
offset = (page-1)*per_page

@items = object.send(assoc_name).find(:all, {:offset => offset, :limit => per_page}.merge(find_options))
@item_pages = Paginator.new self, item_count, per_page, page

return @item_pages, @items
end

I added this to my ApplicationController (application.rb), and now I can paginate assocations til the cows come home.


@photo_pages, @photos = paginate_association @user, :photos, :order => 'created_at'

This helper uses the Rails Pagination stuff, so you can easily use paginate or paginate_association with the same view. Great!

You can also pass additional “find” arguments, such as :order, :include, :join, etc…

Hopefully this is as useful for you as it’s been for me!

source

Feedbacks sur Ruby on Rails

Deux interviews qui achèveront de vous convaincre de l’efficacitĂ© et de l’utilitĂ© de RoR :

Ils ont dit…
CHAT
Laurent Julliard et Richard Piacentini : “Ruby on Rails tourne sur de très gros sites Web aux USA”
L’engouement autour du langage Ruby et de son framework Web Rails ne cesse de croĂ®tre. Nos invitĂ©s, traducteurs du premier livre sur le sujet en France, ont pendant une heure rassurĂ© les inquiets et confortĂ© les convaincus. (24/03/2006)

Yann Klis (Novelys) : “Dans quelques annĂ©es, Ruby ne sera plus un langage alternatif”
Fondateur d’une société plaçant tous ses projets sous les auspices des langages Ruby et Python, Yann Klis rejette la lourdeur de langages comme Java ou C#, et nous explique pourquoi. (02/02/2006)

source

Article sur la scalabilité et la montée en charge des sites RoR :

http://poocs.net/2006/3/13/the-adventures-of-scaling-stage-1