Rails路由与IE一样糟糕

时间:2009-11-30 14:46:07

标签: ruby-on-rails internet-explorer routing

想要使用jQuery,Orbited和FasterCSV,我制作了一个Rails聊天应用程序。

您可以浏览到URL,并且有一个类似于IRC的聊天窗口。您还可以通过访问相同的URL,但在URL中添加“.csv”扩展名来导出聊天窗口的内容。

HTML版本:http://host.name/channel/sweetchatroom

CSV版本:http://host.name/channel/sweetchatroom.csv

在Firefox,Safari和Chrome中,它正常运行。在IE中,如果我访问“HTML”URL,则会获得该页面的CSV版本。我必须手动将“.html”添加到URL中,如下所示:

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

我的路线目前看起来像这样:

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

我用Google搜索了一下并尝试了以下建议:

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

- 和 -

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

他们都没有工作。显然,如果您在未指定格式的情况下访问URL,则Rails不会将params[:format]设置为任何内容。原则上我更喜欢这个,但是文档很清楚,你可以设置一个默认格式,我不知道为什么它不尊重这个。 “:defaults => ...”建议是Rails文档中的内容。

为了让它工作,我不得不改变我的频道控制器的这一部分:

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

对此:

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

它运作完美,但看起来真的很黑。必须有更好的,更“红宝石”的方式。我的路线条目上的语法有误吗?似乎路线应该是这样的地方。

我知道我必须遗漏一些东西。我无法在Google或StackOverflow上找到有关此问题的良好信息。这通常意味着我已经走出了杂草。

1 个答案:

答案 0 :(得分:2)

我通常只把format.html放在第一位。这样,当IE发送一个奇怪的接受标头(如*/*)时,它不会被搞砸。基本上,如果IE说它接受所有内容(比如URL上没有扩展名),Rails会发送第一个匹配的内容。