Développeur Web RoR

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

Tag - rails3.1

Fil des billets

mercredi 28 mars 2012

Prawn, Rails 3.1+ et render : prawnto2

Bon dans la version 4 de Rails les plugins n'existeront plus. Pourtant prawnto c'était sympa ça permettait de faire un render :file => "mavue.pdf.prawn". Eh bien la nouvelle façon de faire c'est d'installer le gem prawnto2 :


gem "prawnto_2", :require => "prawnto"

Après ça un bundle install et c'est parti !

Easy comme dirait l'autre...

Doc officielle de prawnto2 : https://github.com/forrest/prawnto

dimanche 27 novembre 2011

Rails 3 default_scope et unscoped

Rails 3 a apporté un petit truc sympa le default_scope. Il permet d'appeler un scope par défaut sur un model. Par contre il peut être sympa dans certain cas d'éviter d'utiliser le default_scope. C'est pour cette raison qu'il existe unscoped

Exemple :

class Product < ActiveRecord::Base

  default_scope :order_by_name, order(:name)

end

# Ordonné par name

# SELECT * FROM products ORDER BY name;

Product.all 

# SELECT * FROM products;

Product.unscoped.all

A retenir ! En même temps c'est pas très compliqué !

mercredi 2 novembre 2011

Rails i18n - Mettre un texte de remplacement si la traduction n'existe pas

Après lecture du code source du module i18n de rails j'ai trouvé. Donc pour mettre un texte de remplacement si une traduction n'existe pas (translation missing), il faut utiliser l'option default pour la méthode t (translate).

Exemple avec une traduction présente :

t(:hello)

#=> "hello"

Exemple avec une traduction absente :

t(:test)

#=> "<span class=\"translation_missing\" title=\"translation missing: en.test\">Test</span>"

Donc si vous faites ceci vous n'avez plus d'erreur :

t(:test, :default => "texte par défaut")

#=> "texte par défaut"

Pour tester en console il faut créé une instance ActionView et précéder la fonction t de cette instance, comme suit : 

av = ActionView::Base.new

av.t(:hello)

Sinon sur le net, un développeur propose une super idée : personnaliser l'exception levé  et faire appel à l'API de Google traduction

Voici le code pour cette 2ème solution (enfin vue que l'API va devenir payante) :


module I18n
  class << self
    def raise_custom_exception(exception, locale, key, options)
      if MissingTranslationData === exception
        # do something with the missing translation
        return translation
      else
        raise exception
      end
    end
  end
end
I18n.exception_handler = :raise_custom_exception
Url de la discussion : http://www.ruby-forum.com/topic/220355

jeudi 15 septembre 2011

Comment passer un hash de paramêtres à la méthode can de CanCan

Vous connaissez certainement CanCan le système de gestion des droits pour les applications rubyonrails. Can admet 2 paramêtres fixe :

- Le premier est une action ou un alias de plusieurs actions (:index, :show, :manage)

- Le deuxième est la ressource, une classe, ou un symbole correspondant à un controller.

can [:index, :show], Product

On peut également passer à CanCan des paramêtres optionnels pour filtrer les droits en fonction de l'utilisateur (ici si le créateur du produit et l'utilisateur est si le produit est disponible) :

can [:index, :show], Product, :user_id => user.id, :available => true

Dans certains cas, par exemple quand les conditions peuvent être factorisées, il peut être intéressant de passer un hash en utilisant varargs, voici comment faire :

conditions = [{ :user_id => user.id, :available => true }]

can [:index, :show], Product, *conditions

Voir l'article avec l'application des varargs pour ActiveRecord : Varargs en ruby pour ActiveRecord

jeudi 8 septembre 2011

Rubyonrails to_json inclure exclure et appels de méthode

La sérialisation en json est bien pratique pour faire des API, en effet le json est beaucoup moins verbeux que le xml. De plus avec Rails 3.1 les exports ne se font plus avec xml mais json par défaut. Voici un post-it :

konata = User.find(1)
konata.to_json
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true}

Les options :only et :except peuvent être utilisé pour limiter les attributs des models lors de la sérialization json. Par exemple :


  konata.to_json(:only => [ :id, :name ])
# => {"id": 1, "name": "Konata Izumi"}
konata.to_json(:except => [ :id, :created_at, :age ])
# => {"name": "Konata Izumi", "awesome": true}

Pour include des méthodes sur des models, utilisez :methods.


  konata.to_json(:methods => :permalink)
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"permalink": "1-konata-izumi"}

Pour inclure une association, utilisez :include.


  konata.to_json(:include => :posts)
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
{"id": 2, author_id: 1, "title": "So I was thinking"}]}

Plusieurs niveaux d'association peuvent être géré par to_json :


  konata.to_json(:include => { :posts => {
:include => { :comments => {
:only => :body } },
:only => :title } })
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
"title": "Welcome to the weblog"},
{"comments": [{"body": "Don't think too hard"}],
"title": "So I was thinking"}]}
Intégralement pompé mais traduit à partir de http://apidock.com/rails/ActiveRecord/Serialization/to_json