как справиться. что-то в URL - PullRequest
0 голосов
/ 16 марта 2010

Я использую рельсы 2.3.5. У меня есть ресурс для события.

  map.resources :events

  respond_to do |format|
        format.html
        format.js { render :text =>  @event.to_json, :layout => false }
  end

Это публичный сайт, и иногда я получаю URL-адреса вроде

http://domain.com/events/14159-international-hardware-show-2010+91+"prashant"+2010+OR+email+OR+data+OR+base+-ALIBA.BACOM&hl=en&ct=clnk

Я продолжаю получать электронное письмо об исключении. Как мне справиться с такими случаями?

Это сбой, потому что URL имеет .BACOM. Я думаю, рельсы смотрят show.bacom.erb.

Ответы [ 2 ]

1 голос
/ 16 марта 2010

Я думаю, что эта цепочка 'item1 + item2 + item3' - ваша настоящая проблема.

Стандарт HTML очень специфичен в отношении того, как указываются параметры: они должны быть отделены от URL знаком опроса (?), А каждый параметр имеет следующий синтаксис: name=encoded_value. Разделитель параметров - это амперсанд (&).

Таким образом, стандартный способ задания параметров будет:

http://domain.com/events/14159-international-hardware-show-2010?number=91&username=prashant&year=2010&source=ALIBA.BACOM&hl=en&ct=clnk

Такой URL позволит вашему контроллеру получить 91 в params[:number], "prashant" в params[:username] и т. Д.

Если по какой-то причине вы должны сохранить нестандартную структуру, вы можете. Вам нужно будет поместить все нестандартные детали в «большой стандартный параметр».

http://domain.com/events/14159-international-hardware-show-2010?bigparameter=91+prashant+2010+OR+email+OR+data+OR+base+-ALIBA.BACOM&hl=en&ct=clnk

Теперь у вас будет цепочка "91+prashant+2010+OR+email+OR+data+OR+base+-ALIBA.BACOM" в params[:bigparameter]. Вы должны будете разобрать его сами, хотя.

Я настоятельно рекомендую следовать первому варианту. В целом, это хорошая идея, чтобы уважать стандарты (это означает меньше проблем и упрощает работу).

В обоих случаях "?" Знак заставит сервер различать базовый URL и параметры, поэтому у вас не возникнет проблем с форматом URL.

1 голос
/ 16 марта 2010

Если точка (.) Действительно является проблемой, вам необходимо правильно закодировать URL.Это можно сделать так:

require 'uri'

val = "prashant"+2010+OR+email+OR+data+OR+base+-ALIBA.BACOM"
encodedVal = URI.escape(val)

или замените URI.escape на CGI.escape, чтобы заменить пробелы на + (вместо %20). Теперь используйте encodedVal для построенияправильно закодированный URL вместо вашего исходного val.

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