Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

ActionView::Template::Error (couldn't find file 'jquery_ujs'

Date d'édition 2012-04-25 à 10:31

Si lors d'une migration d'une application rails vers rails 3.1 ou 3.2 et que vous obtenez l'erreur ci-dessous :

ActionView::Template::Error (couldn't find file 'jquery_ujs'...

C'est qu'il manque le gem 'jquery-rails' (https://github.com/rails/jquery-rails). Donc mettez ça dans le Gemfile :

gem 'jquery-rails' 

Puis "bundle install && rails s" et là l'erreur devrait disparaître. 

Normalement si vous avez cette erreur, c'est que vous avez ajouté dans application.js :

//= require jquery

//= require jquery_ujs

Ainsi que le group assets dans le Gemfile car sinon ces lignes passent pour des commentaires.

ActiveResource Rails 3 et Rails 3.2 : 406 not Acceptable

Date d'édition 2012-04-11 à 09:58

J'utilise ActiveResource entre deux applications web. Je suis en train de migrer l'application de rails 3.0 vers rails 3.2 et là j'ai une erreur :

ActiveResource::ClientError: Failed.  Response code = 406.  Response message = Not Acceptable.

Le problème vient du fait que rails 3.2 fait ses requêtes par défaut avec le format json. Mais rails 3.0 lui faisait ça par défaut avec xml. Il faut donc faire précéder le choix du format avant la requête :
Product.format = ActiveResource::Formats::XmlFormat
Product.all
Dans cet exemple Product est un ActiveResource qui se connecte à une autre appli rails.
Et là ça marche !

Prawn, Rails 3.1+ et render : prawnto2

Date d'édition 2012-03-28 à 10:02

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

Google maps avec une application rubyonrails : le gem qui geocode !

Date d'édition 2012-03-27 à 14:18

Avec l'api Google maps (v3 et antérieure) il est possible d'utiliser le géocoder de Google maps. Celui permet de trouver les positions longitude et latitude en fonction d'une adresse. Bien pratique (on est pas tous capable de faire ça de tête hein !). Le problème est qu'on est limité dans le nombre de requête (environ 10) via le géocoder par seconde. On se retrouve à faire des trucs bizarre en javascript.

C'est là que le gem geocoder nous aide bien dans un before_save il appelle l'API de Google Maps (mais pas que !) pour mettre à jour les positions dans la bdd. Il faut donc ajouter un champ latitude et longitude. Ne changez pas le nom de ces champs. Ensuite vous dites quel champs (ou méthode) renvoie l'adresse complète.

Dans le model :

# adresse complète
geocoded_by :full_address
# _changed? est une fonction de rails pour tous les attributs et renvoie true si le champ a changé !
after_validation :geocode, :if => :address_changed?
# Pour moi voici la méthode full_address :
def full_address
"#{self.address.gsub(/"/,'\"')}#{self.postcode}#{self.city}"
end

Et hop tout est transparent ! Plus qu'à se concentrer sur le javascript dans utiliser de geocoder en JS.

Doc : https://github.com/alexreisner/geocoder

Site officiel : https://www.rubygeocoder.com/

helper_method la méthode qui permet de rendre disponible des méthodes dans les vues

Date d'édition 2012-03-21 à 09:54

Il peut être intéressant d'utiliser des méthodes de controller dans les vues (ce n'est pas une raison pour faire n'importe quoi hein !). J'écris ce petit billet pour retenir le nom de la méthode, à chaque fois je suis obliger de relire mes codes... Bon il s'agit de helper_method !

Par exemple avec CanCan la méthode current_user pourrait également servir à renvoyer l'utilisateur dans la vue. Voici un exemple d'utilisation :

# encoding : utf-8
class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method [:current_user, :autre_methode]
  def current_user
    #...
  end
  def autre_methode
    #...
  end
end

Donc maintenant dans vos vues vous pouvez utiliser current_user !

Développement ruby et geekeries - rivsc