Skip to content
accelerando

Tag Archives: Daily Fratze

Rails’ respond_to method

06-Aug-07

Ruby On Rails has a neat little feature called “respond_to”:

class WeblogController < ActionController::Base
  def index
    @posts = Post.find :all
    respond_to do |format|
      format.html
      format.xml { render :xml => @posts.to_xml }
      format.rss { render :action => "feed.rxml" }
    end
  end
end

Quelle

This feature uses the routes with the new default route since 1.2:

map.connect ':controller/:action/:id.:format'.

as well as accept header.

With the later and certainly co-starring Internet Explorer 5.5 to 7.0 the fun starts.

In most examples developers serve html, xml and javascript like here. I cannot confirm neither negate that the following problem occurs with these types as well:

I just finished developing an “respond_to jpg” method:

This was there from the beginning: http://dailyfratze.de/michael/2007/8 and i could easily achieve this http://dailyfratze.de/michael/2007/8.jpg with the exact same method:

respond_to do |format|      
  if(!user)
    # some stuff to see if the user exists, blah blah
    redirect_to(:action => :index)
    return
  else
    # some common stuff
 
    format.html {}
 
    format.jpg do
      # some rmagick stuff
      images = Array.new
      # some more and finally 
      send_data image.to_blob, :type =>"image/jpeg", :disposition =>'inline'
      # the return is important, without it and without render, the other block is executed as well
      return
    end
  end
end

I use the following routes in the following order:

map.connect ':user/:year/:month.:format',
                  :controller   => 'daily',
                  :action       => 'month',
                  :requirements => {:year  => /(19|20)\d\d/,
                  :month => /(0?[1-9]|1[012])/}
 
map.connect ':user/:year/:month/',
                   :controller   => 'daily',
                  :action       => 'month',
                  :requirements => {:year  => /(19|20)\d\d/,
                                           :month => /(0?[1-9]|1[012])/}

I know, this is not very DRY, but i didn’t find a way to make the dot in ‘:user/:year/:month.:format’, optional. Format isn’t a problem, but the dot was there to stay. (*)

Nevertheless, the thing worked perfect. Firefox and Safari send “*/*” as an accept header, the format argument was taken and all was well.

IE sends something like “image/jpeg”, “image/png”, “application/x-shockwave-flash”, [... some more stuff...], “*/”* the first request and all subsequent request send “*/*” as accept header. Hell yeah. After closing the window, the process repeats itself.

What does this mean? The first visit to a monthly view on Daily Fratze brought an jpeg image to IE users, the second the standard html page. Crap!

I found a post on a similar problem here: Strange behaviour of respond_to in IE.

The commentors says to put the most important block first but this isn’t an option if the accept header is used wrong. To me it seems that respond_to is somewhat broken. It should use the :format parameter or the accept header, not a mix of it.

I came up with the following solution:

respond_to do |format|      
  format.html {}
 
  format.jpg do
     # some rmagick stuff
     images = Array.new
     send_data image.to_blob, :type =>"image/jpeg", :disposition =>'inline'
     return
  end if params[:format] == 'jpg'  # If responds_to doesn't take care of :format, i'll do!
end

If i generate links to this method with url_for(…blah…, :format => ‘jpg’) i get the correct format and i guess this will work for js, rss and co. as well.

Edit:(*) I’ve noticed some change in behaviour in Rails 2.3.x: I now use :format => nil in the routes and the dot is optional as well then and i have dropped the more or less duplicate routes.

Apple AFP SharePoints

17-Dec-06

Im Moment baue ich einen Mac Mini Core Solo zum Media und Webserver aus. Für diesen Zweck hat das Gerät eine nette, externe Platte mit hinreichend Platz bekommen.

Hin- und herüberlegt: Wenn ich Samba nutze, müssen die Kennwörter des entsprechenden Accounts “unsicher” gespeichert werden. Das klingt nicht gut. Also habe ich mich für AFP entschieden.

Und da ging der Palaver los: Angemeldet, hmm, wo ist das Laufwerk? Stimmt, es werden immer nur die Homeverzeichnisse geshared. So eine Scheisse. Normalerweise findet man ja überall die Konfigurationsdatei, nicht so in diesem Fall. Und wir mir Tante Google gesagt hat, bin ich nicht der einzige der sie sucht. Hab sie auch nicht gefunden. Wenn das jemand weiß, wo das ist… Bitte eine kurze Email schreiben.

Jedenfalls, geholfen habe ich mir mit Sharepoints von HornWare. Entweder als Standalone oder als Pref Pane nutzbar und voila, externe Laufwerke lassen sich als AFP Sharepoint bereitstellen. Das Ergebnis:

afp

Fantastisch!

Alle sagen immer, der Mac Mini Core Solo wäre langsam, aber das muß man mal in Relation zu einem Mac Mini G4 oder einem PC in der Größe sehen. Das Dingen rockt.

Das fertige Ergebnis:

Apple Mac Mini Core Solo Server

Auf dem Rechner läuft übrigens auch Daily Fratze.

Blöde Kleinigkeit (es sind immer!!! die Kleinigkeiten): Warum hat Iomega nicht die Farbe gescheit hinbekommen? Die Platte (Iomega Minimax) ist sonst absolut super. Man kann sie per FireWire und USB gleichzeitig anschliessen und per DIP Schalter einen Anschluss auswählen. Das hat den Vorteil: Man kann beide Hubs (FireWire und USB nutzen). Das geht bei vielen billigen Platten nicht.

Das schöne an AFP ist, dass es ein sogenanntes transparentes Protokol ist. Das heißt, nutzende Programme bekommen nichts davon mit, dass ihre Dateien janz woanders sind. So kann man z.B. in iTunes beim Start die ALT Taste drücken und eine andere Bibliothek auswählen. Ganz transparent habe ich dann auf jedem Rechner die gleichen Daten. Der Vorteil gegenüber dem Musicsharing via iTunes: Ganz einfach, die Playcounts erhöhen sich, ich kann die Ratings ändern und sogar übers Netz CDs rippen.

Praktischerweise funktionieren so auch alle Skripte fürs Backup, genau wie bisher.

Rolling on Rails: DailyFratze.de

03-Dec-06

Hier angedeutet, dort vorgestellt und jetzt fertig:

DailyFratze.de

Viel Spaß!

DailyFratze 2.0 Preview

16-Oct-06

Ich habe ja hier schon öfter von einer neuen Daily Fratze Version gesprochen. Bald ist es soweit.

Eine Vorschau kann man unter

http://dailyfratze.michael-simons.eu

erreichen.

Für Passwort und Benutzername bitte eine kurze Email an rotnroll666@mac.com schicken, ansonsten muss mit dem Bild hier vorlieb genommen werden:

DailyFratze2.0 Preview 1

DailyFratze on Rails

06-Jul-06

Die letzten Posts über Rails und Co. enstanden natürlich nicht aus heiterem Himmel. Ich entwickle zur Zeit eine neue Version von DailyFratze.de auf Basis von Rails.

Das ganze macht extrem viel Spaß und auch zügig Fortschritte. Es wird eine ganze Menge neuer Features geben, ein vollständig neues Layout, auf jedenfall: Ganz toll.

Development Version von DailyFratze.de

Das Bild ist ein kleiner Screenshot der Anwendung. Im Vordergrund sind man den Inspector aus Webkit. Webkit ist die Entwicklungsversion vom Mac OS X Browser Safari, den man sich auf der nightly Seite von Webkit.org kostenlos laden kann. 

Alleine der Inspektor ist superpraktisch. So zeigt er zum Beispiel die vollständige CSS Kaskade für jedes Element an, inklusive überschriebener Properties. Mit ihm kann man im DOM Baum suchen und vieles mehr.
Webkit beherrscht darüber hinaus nativ SVG, auch etwas schönes.

Man darf also gespannt sein, sowohl auf die neuesten Entwicklungen von DailyFratze.de als auch von neuen Safari Versionen.

(Der Header im Screenshot enthält zur Zeit Bilder von anderen, täglichen Photoprojekten, die ich schätze und die mich inspiriert haben. Falls ich diesen so eines Tages in einer Onlineversion die ich nicht nur privat nutze, verwende, werde ich natürlich alle Rechteinhaber vorheransprechen. Nicht, dass sich jetzt jemand durch sein Konterfei in diesem kleinen Screenshot gestört fühlt. Wenn doch, bitte Bescheid sagen.)