Rails 3.2.1 / ruby-1.9.3 / YAML / psych

Heute habe ich die KuFa HP auf die aktuelle Rails (3.2.1) und Ruby Version (1.9.3) aktualisieren wollen. Das ganze hat mich mehr Nerven gekostet als erwartet.

Hintergrund
Im Vergleich zu der alten Ruby 1.8.x Version nutzt Ruby 1.9.x einen neuen Parser für die yml Files. Anstatt wie bisher syck nutzt das neue ruby jetzt psych. Das wurde geändert weil syck wohl seit ner ganzen Weile von niemandem mehr betreut wird und psych schenller und neuer ist usw.. Psych ist aber leider ein wenig genauer wenn es um die yml Files geht d.h. nach dem deployen der Homepage auf den Server ist mir erst Mal alles um die Ohren geflogen mit Parsing Fehlern die auf die de.yml sprich auf die locales hindeuten.

Lange Rede kurzer Sinn nach stundenlanger Suche im Netz bin ich dann endlich auf folgende Syntax für den Anfang der de.yml gestossen die mit psych funktioniert:


day_names:
- Sonntag
- Montag
- Dienstag
- Mittwoch
- Donnerstag
- Freitag
- Samstag

abbr_day_names:
- So
- Mo
- Di
- Mi
- Do
- Fr
- Sa

month_names:
- ~
- Januar
- Februar
- März
- April
- Mai
- Juni
- Juli
- August
- September
- Oktober
- November
- Dezember

abbr_month_names:
- ~
- Jan
- Feb
- Mär
- Apr
- Mai
- Jun
- Jul
- Aug
- Sep
- Okt
- Nov
- Dez

order:
- !ruby/symbol day
- !ruby/symbol month
- !ruby/symbol year

Damit hat dann der Spuck mit den Parsing Fehlern ein Ende und man kann endlich erfolgreich auf die aktuellen Versionen migrieren.

X-CSRF Meta Madness mit Rails 3.0.7

Nachdem ich heute die KuFa Applikation auf Rails 3.0.7 aktualisiert hatte bin ich auf das Problem gestossen das der Fileuploader den ich intern verwende zwar noch funktioniert, ich aber nach jedem Upload ausgeloggt werde. Nicht gerade die Benutzererfahrung die ich erwartete. Ein Blick in die Änderungshistorie von den jeweiligen Rails Versionen sagt mir das mit Version 3.0.5 die CSRF Prüfung erweitert wurde die zur Folge hat das jeder Zugriff auf die Seite, also auch ein AjaxRequest, ohne ein gültiges CSRF Token die Session beendet. Darunter direkt ein Link zu einem Snippet das fur Prototype bzw. jQuery für AjaxRequest den entsprechenden Header mitliefern soll.


$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});

Leider funktioniert der Upload danach immer noch nicht und ich werde weiterhin ausgeloggt.
Ein Blick in das Javascript File des Fileuploaders offenbart mir folgende Funktion für den Dateiupload:


// build query string
params = params || {};
params['file'] = name;
var queryString = qq.obj2url(params, this._options.action);

xhr.open("POST", queryString, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.send(file);

Scheinbar ist das nicht das gleiche wie der AjaxRequest der oben in der Routine erweitert wurde. Also mein Versuch die Upload Funktion zu erweitern:


// build query string
params = params || {};
params['file'] = name;
var queryString = qq.obj2url(params, this._options.action);
var token = $("meta[name='csrf-token']").attr("content");

xhr.open("POST", queryString, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.setRequestHeader("X-CSRF-Token", token);
xhr.send(file);

Und siehe da, der Upload funktioniert wieder einwandfrei und die Session bleibt auch bestehen. Viel Spass damit