Follow me
RSS feed
My sources
My Viadeo

Les vues dans Capcode

Greg | 07 May 2009

devJe viens de mettre en ligne la version 0.5.0 de Capcode avec au programme une évolution qui intéressera peut-être ce qui ne voyaient pas encore d'intérêt à ce micro-framework : l'ajout des vues.

Je sais qu'il y a peu de temps, j'avais dit que les vues étaient un détail dont je me souciais peu. Et bien c'est faux. En fait pas tant que cela dans le sens ou j'utilise abondamment Cappuccino. Mais mon erreur consistait à ne pas considérer les réponses JSON comme des vues. En effet, c'est logique quand on le dit... Donc je m'excuse et pour cela j'ai ajouté les vues dans Capcode.

Par défaut, la déclaration d'une vue se fait dans le module Capcode::Views. Ainsi si vous avez le contrôleur suivant :

module Capcode
  class Hello < Route '/hello/(.*)'
    def get( you )
      @you = you
      @you = "you" if you.nil?
      
      render( :hello )
    end
  end
end

Il suffit d'utiliser le helper render en lui passant en paramètre le nom de la vue à utiliser (ici hello). Cette dernière n'a plus qu'à être déclarée et le tour est joué :

module Capcode::Views
  def m_hello
    "Hello <b>" + @you + "</b>, it's '#{Time.now} !"
  end
end

Rassurez-vous, il ne s'agit là que de la base... En effet, ce système de rendu peut très facilement être étendu afin d'utiliser des solutions telles que Markaby, Haml, Erb, ... Pour cela il suffit de créer des helpers sous la forme render_TYPE ou TYPE est le type utilisé pour le rendu. Capcode en propose trois par défaut : render_markaby, render_haml et render_json. Pour utiliser ces systèmes de rendu, nous n'appelons par directement render_TYPE mais nous utilisons la syntaxe render( :TYPE => ... ). Voici un exemple avec Markaby :

# file: sample.rb
require 'rubygems'
require 'capcode'
require 'capcode/render/markaby'
  
module Capcode
  class Hello < Route '/hello'
    def get
      @t = Time.now
      render :markaby => :time
    end
  end
end
  
module Capcode::Views
  def time
    # We use Markaby in Capcode::Views.time
    html do
      body do
        p {
          text "Hello World "
          b @t
        }
      end
    end
  end
end

Capcode.run( )

Si vous souhaitez faire la même chose avec Haml :

# file: sample.rb
require 'rubygems'
require 'capcode'
require 'capcode/render/haml'
Capcode::Helpers.haml_path = "./my_haml_views"

module Capcode
  class Hello < Route '/hello'
    def get
      @t = Time.now
      render :haml => :time
    end
  end
end
  
Capcode.run( )

Le rendu via Haml se fait en plaçant la vue dans un fichier .haml dans cet exemple, le fichier attendu est ./my_haml_views/time.haml :

%html
  %body
    %p 
      Hello World 
      = @t

L'utilisation avec Erb est similaire, mais le fichier doit avoir comme extension .rhtml. De plus, avec Haml, vous réglez le chemin d'accès aux fichiers via Capcode::Helpers.haml_path, avec Erb, il faudra utiliser Capcode::Helpers.erb_path.

Enfin, voici un exemple avec json :

# file: sample.rb
require 'rubygems'
require 'capcode'
require 'capcode/render/json'

module Capcode
  class Hello < Route '/hello'
    def get
      @t = Time.now
      render :json => { :time => @t }
    end
  end
end

Capcode.run( )

Si vous regardez le code systèmes de rendu, vous verrez qu'il est très facile de faire le votre. Donc si vous n'aimez pas Haml ou Erb, n'hésitez pas.

Il y a une autre raison qui m'a poussé à ajouter les vues : pouvoir faire du rendu via des feuilles de style XSLT. En effet, la méthode render est en cours de modification et devrait permettre de prendre des paramètres. Ainsi lors de la prochaine mise à jour, vous devriez pouvoir écrire render( :xml => "mon_xml", :xsl => "ma_xsl" ).

Vous l'avez compris, le système de rendu dans Capcode est très souple. Et mes besoins actuels sur le sujet devraient faire aboutir de nouvelles possibilités rapidement.

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.