Rails роутинг с IE
Желая поиграть с jQuery, Orbited и FasterCSV, я создал приложение для чата Rails.
Вы можете перейти к URL-адресу, и есть окно чата, похожее на IRC. Вы также можете экспортировать содержимое окна чата, посетив тот же URL-адрес, но добавив к нему расширение ".csv".
HTML версия: http://host.name/channel/sweetchatroom
CSV версия: http://host.name/channel/sweetchatroom.csv
В Firefox, Safari и Chrome все работает нормально. В IE, если я посещаю URL-адрес "HTML", я получаю 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
Это работает отлично, но кажется действительно взломанным. Должен быть лучший, более рубиновый способ. У меня неправильный синтаксис в моей записи маршрутов? Кажется, что маршруты, где это должно быть.
Я знаю, что я должен что-то упустить. Я не смог найти хорошую информацию по этой проблеме в Google или в Stackru. Это обычно означает, что я нахожусь в сорняках.
1 ответ
Я обычно просто ставлю format.html первым. Таким образом, когда IE отправляет странный принимает заголовок (например, */*
), это не запутано. По сути, если IE говорит, что он принимает все (например, когда в URL нет расширения), Rails отправит ему первое, что соответствует.