Développeur Web RoR

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

mercredi 25 avril 2012

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

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.

mercredi 11 avril 2012

ActiveResource Rails 3 et Rails 3.2 : 406 not Acceptable

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 !

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

mardi 27 mars 2012

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

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 : http://www.rubygeocoder.com/

jeudi 22 mars 2012

Déployer sur plusieurs serveurs différents : Capistrano Multistaging

Lors du déploiement d'une application rubyonrails, il peut être pratique de pouvoir déployer sur un serveur de préproduction, pour cela il faut installer le gem capistrano-ext puis mettre ces lignes dans le fichier deploy.rb. Les stages correspondent à des configurations de déploiement différente (ce qui est dans deploy.rb est commun et surchargeable). Ensuite dans les fichiers  deploy/staging.rb, deploy/production.rb et deploy/testing.rb se trouvent les spécificités. (ils ont la même syntaxe que le fichier deploy.rb)


set :stages, %w(staging production testing)

set :default_stage, "testing"

require 'capistrano/ext/multistage'

Une fois la config terminée cap -T listera les différents stages.

Tout ça n'est pas nouveau, mais j'en avais jamais parlé donc pour ceux qui ne connaissent pas... vous n'avez plus qu'à essayer

Source : http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage

mercredi 21 mars 2012

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

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 !

vendredi 16 mars 2012

Beautiful-Scaffold : content_for :head et PJAX script et style

Beautiful-Scaffold utilise PJAX : Ajax avec PushState. Le problème est que lorsque l'on veut ajouter un script/style dans une page on se retrouve bloqué le content_for ne fait pas son boulot (normal car il n'y a pas de render de layout).

La solution consiste a les mettre dans la vue :

<% headcontent = capture do %>
  <style>
    .i-love-css{
      font-size:42px;
    }
  </style>
<% end %>
<% if request.headers['X-PJAX'] then %>
  <%= headcontent %>
<% else %>
  <% content_for :head do %>
    <%= headcontent %>
  <% end %>
<% end %>

Bon et sinon si vous n'avez pas le choix : une balise qui doit obligatoirement être dans le layout et bien il suffit d'ajouter la class "nopjax" dans le lien pour signaler à pjax de ne pas faire de requête en AJAX.

- page 1 de 41