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 отправит ему первое, что соответствует.

Другие вопросы по тегам