2009-11-30 6 views
1

Voulant jouer avec jQuery, Orbited, et FasterCSV, j'ai fait une application de chat Rails.Rails routage est foutu avec IE

Vous pouvez accéder à une URL et une fenêtre de discussion similaire à IRC s'affiche. Vous pouvez également exporter le contenu de la fenêtre de discussion en visitant la même URL mais en ajoutant une extension ".csv" à l'URL.

version HTML: http://host.name/channel/sweetchatroom

version CSV: http://host.name/channel/sweetchatroom.csv

Dans Firefox, Safari, Chrome et il fonctionne normalement. Dans IE, si je consulte l'URL "HTML", j'obtiens la version CSV de la page. Je dois ajouter manuellement ".html" à l'URL comme ceci:

http://host.name/channel/sweetchatroom.html 

Mon parcours ressemble actuellement à ceci:

map.chat '/channel/:name.:format', :controller => 'channels', :action => 'show' 

Je googlé un peu et essayé les suggestions suivantes:

map.slug '/channel/:slug.:format', :controller => 'channels', :action => 'show', :defaults => {:format => 'html'} 

- et -

map.slug '/channel/:slug.:format', :controller => 'channels', :action => 'show', :format => 'html' 

Aucun d'eux n'a travaillé. Apparemment, si vous visitez une URL sans spécifier le format, Rails ne définit pas params[:format] à quoi que ce soit. Lequel en principe je préfère, mais les docs sont assez clairs que vous pouvez définir un format par défaut et je ne sais pas pourquoi il ne respecte pas cela. La suggestion ": defaults => ..." est ce qui est dans les docs de Rails.

Pour obtenir de travailler que je devais changer cette partie de mon contrôleur canaux:

respond_to do |format| 
    format.csv { 
    send_data channel_to_csv(@channel), 
     :type => "text/plain", 
     :filename => "#{@channel.slug}.csv", 
     :disposition => 'inline' 
    } 
    format.html # show.html.erb 
    format.xml { render :xml => @channel } 
end 

à ceci:

respond_to do |format| 
    format.csv { 
    send_data channel_to_csv(@channel), 
     :type => "text/plain", 
     :filename => "#{@channel.slug}.csv", 
     :disposition => 'inline' 
    } if params[:format] == 'csv' # <-- Here is the change 
    format.html # show.html.erb 
    format.xml { render :xml => @channel } 
end 

Il fonctionne parfaitement, mais semble vraiment hackish. Il doit y avoir une meilleure façon, plus "Ruby". Est-ce que j'ai la syntaxe erronée sur l'entrée de mes routes? Il semble que les routes sont là où cela devrait être.

Je sais qu'il me manque quelque chose. Je n'ai pas trouvé de bonnes informations sur ce problème sur Google ou sur StackOverflow. Cela signifie généralement que je suis loin dans les mauvaises herbes.

Répondre

2

D'habitude, je mets d'abord le format.html. De cette façon, quand IE envoie un en-tête d'acceptation bizarre (comme */*), il ne se bloque pas. Fondamentalement, si IE dit qu'il accepte tout (comme quand il n'y a pas d'extension sur l'URL) Rails lui enverra la première chose qui correspond.

+0

C'était l'une des choses que j'avais considérées et pour une raison quelconque, je ne l'avais pas essayé. – hernan43

+0

+1 pour l'utilisation de "wonky" dans votre titre. Ceci est le problème d'en-tête de rails 2.0 IE Accepts. Google pour "rails ie accepte". –