Rails: Ajax_Scaffold und Globalize

Ich musste leider feststellen, dass die beiden zusammen nicht wirklich funktionieren :(
Der Grund liegt wohl darin, dass Globalize nach einem lokalisierten Template sucht und dabei nicht von einem Template mit Endung ausgeht. Im Controller wird jedoch

render :action => 'new.rjs'

angegeben.
Aufgrund der Erfahrung einiger anderer Betroffener habe ich dann in den Dateien die ’.rjs’-Endung entfernt, was aber auch nicht ganz funktionierte. Anscheinend aufgrund der Partials in den RJS-Templates?!
Mein nächster Ansatz war, in Globalize selbst den Templatenamen nach Endungen abzusuchen und diese zu entfernen, was aber auch nicht zu dem gewünschten Ergebnis führte: es scheint, dass hier dann von einem über AJAX eingefügten Formular kein XML-HTTPRequest, sondern ein ganz normaler Request gesendet wird. Die übertragenen Daten scheinen auch nicht entsprechend enkodiert zu sein.

Für’s erste bin ich jetzt einen schmerzhaften Kompromiss eingegangen: da, wo im Adminbereich übersetzt werden muss, kein Ajax und da wo ich Ajax haben will, kein “Locale.set”.
Aber ich werde weiter probieren und das Ganze Schritt für Schritt zerlegen. Schließlich gibt es ja für jedes Problem eine Lösung…

Große Dateien per Email

Bei mehr als 900kb wird es mit dem Versand von größeren Daten schwierig, da nicht alle Mailserver Anhänge/Emails von dieser Größe zulassen.
Eine Alternative wäre, das Ganze dann auf den Webspace zu laden und einen Download-Link anzubieten, was aber ohne entsprechende Maßnahmen die Dateien auch der breiten Masse zuführt.
CivilNetizen ist für Mac und Windows zu haben und erlaubt das Senden von Paket-Hashes. Im Grunde läuft es so ab, dass über das Programm Dateien als ”.parc” gepackt und hochgeladen werden und gleichzeitig ein Hashcode generiert wird, der dann per Mail verschickt wird.
Der Empfänger gibt dann diesen Hashcode in sein Programm ein und kann sich die Datei herunterladen.
Einziger Nachteil der Methode ist, dass der Empfänger das Programm ebenfalls installiert haben muss. Ansonsten funktioniert die “Post” meiner Erfahrung nach recht reibungslos.

Neues aus dem Leben

Jaja, so ist das mit der Zeit und den guten Vorsätzen…
Aber untätig war ich während meiner Abstinenz nicht.

Zum einen habe ich in einem rasanten Kurs meinen Sportbootführerschein (Binnen) gemacht. Rasant deshalb, weil es vom ersten Besprechungstermin bis zur Prüfung nur 3 Wochenenden waren und ich eigentlich gar keine Zeit zum Lernen hatte… Trotzdem bestanden—Puuh ;)

Zweitens habe ich mich nach langem Rechnen (wie bringe ich das in meiner Zeit unter) entschieden, mein Hobby auch zum offiziellen Beruf zu machen und mich für ein Studium der “Angewandten Informatik” entschieden. Hauptprogrammiersprache ist—soweit ich sehen konnte—Java (denke/hoffe mal, dass ich soweit fit bin und mir vielleicht die eine oder andere Stunde büffeln sparen kann). Ich werde auf jeden Fall berichten…

Drittens habe ich zu meinem Geburtstag mein lang ersehntes Wacom für den Mac bekommen (den PC nutze ich so gut wie nie, daher auch das Tablett nicht, das noch einen seriellen Anschluss hatte). Einen Großteil meiner freien Zeit habe ich also mit digitalem Zeichnen und Malen zugebracht um mich wieder “digital” einzuarbeiten und Illustrationen für ein neues Projekt zu erstellen (mal sehen, vielleicht folgen ja hier auch noch Bilder).

Und zu guter Letzt habe ich reichlich Zeit damit verbracht, einen KK-Antrag für einen Kunden durchzuboxen. Es scheint, dass es immer noch einige Hoster in Deutschland gibt, die eine dort gehostete Domain nur über den Rechtsanwalt wieder herausrücken… Schade eigentlich!

Textil-Tattoos gesucht

Transfer-Folie zum Aufbügeln auf Textilien gibt es schon lange. Diese ist aber mehr oder weniger permanent.
Ich suche schon seit geraumer Zeit eine Transferfolie, die man „aufkleben“ und wieder abziehen kann. Normale Aufkleber scheiden leider aus, da sie sich nicht mit dem Stoff bewegen, sondern recht unbeweglich sind.
Hat schon mal jemand so etwas in der Art gesehen? Ich bin für jeden Tipp dankbar.

(Font)-Flagge zeigen!

Die Comic-Sans ist allein schon vom Namen her nur für eines wirklich geeignet – für Comics (und vielleicht, um Bilderalben mit netten Sprüchen zu versehen).
Allerdings findet man sie ständig dort wieder, wo sie völlig fehl am Platze ist: Speisekarten, Poster, Briefe, Emails…
ban comic sans will der Folter für’s Auge nun ein Ende bereiten und bietet reichlich Artikel für den Kampf gegen die Comic.
Mal sehen… für einen anderen Preis würde ich mir die Tasse ja sogar noch leisten ;)

Rückmeldung nach langer Zeit

In der letzten Zeit habe ich meinen guten Vorsatz, öfter zu posten leider nicht so ganz einhalten können und möchte mich dafür entschuldigen.

Jetzt, wo der größte „Zeiträuber“ (ein Onlineshop) fertig gestellt ist, habe ich hoffentlich auch wieder Zeit zum Schreiben ;)

Validieren mehrerer Models in Rails? [Update]

Rails ist eigentlich recht komfortabel, wenn es um Validierung geht. Für das Validieren der zugehörigen Objekte gibt es die Methode“ validates_associated, mit der erst gespeichert werden kann, wenn auch in dem/den anderen Objekt/en alles in Ordnung ist.
Leider gibt diese Methode nur die Information aus, dass das entsprechende Objekt „invalid“ ist, nicht aber weitere Informationen zu Feldern.
Ruft man im Template dagegen error_messages_for ‘anderes Objekt’ auf, bekommt man auch gleich ein zweites div-Element für die neuen Fehlermeldungen – nicht unbedingt dass, was man will.

Mein Problem lag darin, dass ein Benutzer ja verschiedene Adressen haben kann (Lieferadresse, Rechnungsadresse, etc) und somit die Adresse in einer anderen Tabelle gespeichert werden, jedoch zusammen mit anderen Benutzerdaten in einem Formular abgefragt werden sollte.
Ich habe das Problem vorerst gelöst, indem ich im Controller erst erst einmal für die Adresse und dann für den Benutzer is_valid? aufgerufen habe. Wenn eines der Models den Wert false zurückgegeben hat, habe ich die Fehlermeldungen für die Adresse denen des Benutzers hinzugefügt.

def create
    @saved = false
    @user = User.new(params[:user])
    @invoice_address = Address.new(params[:invoice_address])    
    if @invoice_address.valid?
      @invoice_address.save
      @user.invoice_address = @invoice_address
    end     
    if @user.valid? && @invoice_address.valid? && @user.save
      @saved = true
    else
      @invoice_address.errors.each {|attr, msg| 
                         @user.errors.add(attr, msg)}      
    end
    render :action => 'new.rjs'
end

Allerdings ist das doch reichlich Aufwand, wenn man es gleich an mehreren Stellen braucht.
Also habe ich das Ganze nun erst einmal in eine Funktion gepackt und diese an verschiedenen Stellen aufgerufen.
So richtig toll ist aber auch das nicht: was, wenn ich mal 3 verschiedene Models in einem Formular benötige? Ich habe es schon mit einer rekursiven Funktion versucht, aber das funktioniert dann irgendwie nicht, wenn ich gleichzeitig auch gettext verwenden will.

Sollte also schon jemand das Problem erfolgreich gelöst haben, wäre ich natürlich für jeden Hinweis dankbar. Ansonsten werde ich weiter basteln und die Lösung (für den Fall, dass ich sie finde) natürlich posten ;)

Update: Warum in die Ferne schauen, wenn das Ziel ist doch so nah? – Die einfachste Lösung fällt einem doch immer wieder zuletzt ein.
Ich habe nun im Controller diesen ganzen Mist entfernt, da er ja eigentlich zum Model gehört und in die Methode validate gepackt.

def validate
    unless invoice_address.valid?
        invoice_address.errors.each { |attr, msg| 
                            self.errors.add(attr, msg) }
    end
end

Die Adresse muss dazu allerdings zugewiesen und nicht nil sein (das wird allerdings in den anderen Validierungen geprüft).

Der schnellste Umzug aller Zeiten...

Der Umzug von einem Hoster zum anderen ist vollbracht – und das in mehr als nur Rekordzeit! Die KK-Anträge habe nämlich gestern erst zur Post gebracht.
Da so ein Umzug ja in der Regel ein paar Tage dauert, hatte ich mir den Upload eigentlich erst für heute Abend vorgenommen. Ich hoffe mal, die Seite war nicht allzu lange nicht erreichbar.
Auf jeden Fall funktioniert (hoffentlich) wohl alles so wie bisher und das Umlaut-Problem der ersten Zeit wurde nun auch entsprechend gelöst.

Umzug...

mileandra zieht um! Nachdem man mir bei Tibit so entgegengekommen ist, dass man sogar noch von mir benötigte Zusatzmodule installiert hat und sie außerdem noch im geliebtem und (fast) benachbarten Bochum sitzen, ist der Umzug nun besiegelt.
Mal sehen, wenn ich es irgendwann schaffe, auch die alten URLs übernehmen zu können, steigt die Seite dann vielleicht gar noch auf Typo um ;)
Erst einmal wird aber (außer dem Provider) alles bleiben wie es ist. Ok – das Posten habe ich in letzter Zeit aufgrund von reichlich Arbeit ziemlich vernachl&auml,ssigt, was ich unbedingt noch ändern will (das Posten, nicht die Arbeit).

Die Qual der Wahl bei Providern (Update)

Ich habe festgestellt, dass die Wahl des Providers tatsächlich zu einer „Unendlichen Geschichte“ werden kann.
Kaum ein Provider bietet eine phpinfo an und bei denen, die es anbieten, ist auch nicht alles aktiviert was da so steht.
Ein Geheimtipp ist für mich der Support schon vor dem Vertrag geworden. Wenn man merkt, dass man einfach mit Standard-Antworten abgespeist wird, wird das wohl auch im laufenden Betrieb passieren.
Ein absolutes Negativ-Beispiel war für mich Evanzo wo eine Kundendomain gehostet war. In der phpinfo stand eindeutig, dass das Modul mod_rewrite installiert ist. Auf die Frage, ob man es denn nun auch für die Domain/den Webspace nutzen könne war die Antwort einfach nur ein klares „Nein, das Modul ist nicht aktiviert“.
Anders Silverbird wo (obwohl der Webspace um einiges günstiger ist) direkt eine Email kam – mit der Aussage, dass es soeben aktiviert wurde.
Soeben habe ich mich bei Tibit umgehört, da dort sowohl PHP4/PHP5, als auch Ruby on Rails angeboten wird. Im Chat! (jawohl, so etwas gibt es auch) wurde mir gesagt, dass das gettext-Paket für RoR bereits installiert ist und man sich (aufgrund meiner Anfrage) sofort um die Installation von RMagick kümmern und mich dann benachrichtigen würde. Na dann – wenn ich morgen tatsächlich eine entsprechende Email bekomme ist der Provider-Wechsel wohl besiegelt. Man will ja schließlich flexibel bleiben – vor allem nachdem ich ja jetzt so richtig in RoR einsteigen konnte ;)

Update: Na das nenne ich dann wirklich Support! Die von Tibit haben tatsächlich direkt die entsprechenden Pakete installiert und mir sogar einen Test-Account eingerichtet.