Rails роутинг с IE - PullRequest
       4

Rails роутинг с IE

1 голос
/ 30 ноября 2009

Желая поиграть с 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 или в StackOverflow. Это обычно означает, что я ухожу в сорняки.

1 Ответ

2 голосов
/ 30 ноября 2009

Я обычно просто ставлю format.html первым. Таким образом, когда IE отправляет странный заголовок «принимает» (например, */*), он не запутывается. По сути, если IE говорит, что он принимает все (например, когда в URL нет расширения), Rails отправит ему первое, что соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...