【发布时间】:2009-11-30 14:46:06
【问题描述】:
想玩 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'
我用谷歌搜索了一下,并尝试了以下建议:
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
它工作得很好,但看起来真的很hackish。必须有一种更好、更“Ruby”的方式。我的路线条目是否有语法错误?似乎路线应该在哪里。
我知道我必须遗漏一些东西。我在 Google 或 StackOverflow 上找不到关于这个问题的好信息。这通常意味着我已经摆脱了困境。
【问题讨论】:
标签: ruby-on-rails internet-explorer routing