Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

L'attribut form d'html5

Date d'édition 2013-09-29 à 19:11

Vous avez peut-être un jour souffert des formulaires en html. html5 introduit une nouveauté l'attribut form, celui-ci permet de placer les input/select/button partout dans votre page web et de leur associer à un formulaire.

<form id="monform">

</form>

<input type="text" form="monform" name="name" value="" placeholder="Votre nom">

Ça peut-être bien pratique croyez-moi.

Faire fonctionner l'API JSON de Devise 3.1.0 avec Rails 4

Date d'édition 2013-09-11 à 16:53

Lors de la migration d'une de mes applications rails 3 en rails 4 (et devise 2.0.1 en 3.1.0). J'ai eu des petits soucis, deux pour être précis, un lié à Devise >2.0.1 et un à Rails >3 :

1) Rails 4

Rails 4 : ne permet plus d'action si l'authenticityToken n'est pas présent ou invalide (comme c'est pour une API, je ne veux pas de Auth..Token), voici la solution :

#protect_from_forgery with: :exception
protect_from_forgery with: :null_session, :if => Proc.new { |c| c.request.format == 'application/json' }

Si le format de la requête est en JSON on ne protège pas l'action. A vous de voir si ça pose un problème de sécurité.

2) Devise

Il faut dire explicitement à Devise de répondre aux requêtes json : à mettre dans config/application.rb et non dans l'initalizers/devise.rb !

config.to_prepare do
   DeviseController.respond_to :html, :json
end

Cette API est par exemple utilisée par RubyCas devise authenticator.

Normalement tout devrait fonctionner.

A lire aussi :

https://github.com/plataformatec/devise/issues/2209

https://github.com/plataformatec/devise/issues/2215

Interfacer RubyCas avec une application RubyOnRails et Devise

Date d'édition 2013-07-04 à 07:14

RubyCas gère exclusivement le Single Sign On (SSO). En aucun cas il ne gère la gestion des utilisateurs (création de compte, mot de passe oublié, compte verrouillé, etc) : pour tout ça il faut une application séparée (ou bien le faire soi même sur l'application sinatra rubyCas). Devise est un gem reconnu qui fait tout ça très bien, pas question de réinventer la roue !

Le problème c'est que de base les authenticators (module de rubyCas de connexion aux données) ne permettent pas de se connecter à une application avec Devise. Vous pouvez par exemple vous connecter en direct à la base de donnée pour hasher le mot de passe avec BCrypt et vérifier que le hash corresponde (Module SQLBcrypt, SQL, SQLEncrypted). Certe ça fonctionne mais vous perdez l'intérêt de Devise (verrouillage de compte, compte non confirmé, etc).

Un développeur a codé un authenticator pour Devise (via l'api REST Json), sa pull-request est en attente sur Github mais comme j'en ai besoin je l'ai testé et ça marche. Ça marche bien ! Voici le lien vers le fichier : https://github.com/atyndall/rubycas-server/blob/054f219e0dd544392c913597c1f0275ac7c85af2/lib/casserver/authenticators/remote_devise.rb

Par contre il y a un bug pour devise >= 2.2.0 donc utilisez la dernière en 2.1. Et n'oubliez pas de lire mon commentaire en bas de la pull-request concernant include_root_in_json (ça vous évitera de chercher quelques heures).

Lien vers la pull-request : https://github.com/rubycas/rubycas-server/pull/155

Single Sign On (authentification centralisée) avec RubyCas

Date d'édition 2013-07-03 à 16:58

RubyCas-Server est une application sinatra qui respecte la norme CAS (central authentification service). Elle permet le single sign on. (Wiki RubyCas : https://github.com/rubycas/rubycas-server/wiki)

RubyCas-server retient le service qui demande l'authentification mais si l'on effectue quelques manipulations (création de compte par exemple), le redirection vers le service ne sera pas effective. Il n'y a pas grand chose à faire pour palier à ce problème. Il suffit d'activer les sessions dans rubycas-server. Comme il s'agit d'une application sinatra il faut activer les sessions manuellement :

dans le fichier lib/casserver/server.rb

enable :sessions

Ensuite ligne 307 (dans la route get "#{uri_path}/login" do) il faut retenir le service et le surcharger en cas d'autres redirections, remplacer la ligne @service = clean_service_url(params['service']) par

if params['service'].nil? or params['service'].empty? then
@service = clean_service_url(session['service'])
else
session['service'] = params['service']
@service = clean_service_url(params['service'])
end

Maintenant vous aurez la redirection vers le service effective même après une création de compte, un mot de passe oublié ou autre !

Eviter de tester la non nullité lors d'un chaînage de méthode en ruby avec try (avec RubyOnRails)

Date d'édition 2013-06-17 à 08:19

Il peut arriver d'avoir ce genre de code :

command.contact_delivery.name

Ici vous êtes obligé de tester que command et contact_delivery ne sont pas nil. RubyOnRails a ajouté une méthode à Object qui permet d'essayer d'accéder à une méthode. Elle s'appelle try.

Voyez plutôt :

command.try(:contact_delivery).try(:name)

Source : 

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/try.rb

https://api.rubyonrails.org/classes/Object.html#method-i-try

Développement ruby et geekeries - rivsc