Rails 3 - дружественные параметры в URL (GET) - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть приложение rails 3, и теперь я реализую фильтр для своего каталога.Фильтры передают данные контроллеру через GET-запрос.В результате у меня появилась такая ссылка в браузере после отправки формы (применить поиск):

http://localhost:3001/shoes?filter%5BShoeBottomType%5D%5B%5D=2&filter%5BShoeClassification%5D%5B%5D=1&filter%5BShoeClassification%5D%5B%5D=2&filter%5BShoeElation%5D%5B%5D=3&filter%5BShoeElation%5D%5B%5D=4&filter%5BShoeElation%5D%5B%5D=5&filter%5BShoeLiningColor%5D%5B%5D=2&filter%5BShoeLiningColor%5D%5B%5D=3&filter%5BShoeLiningColor%5D%5B%5D=4&filter%5BShoeTopColor%5D%5B%5D=1&filter%5BShoeTopColor%5D%5B%5D=2&filter%5Bonly_action%5D%5B%5D=1&page=2

Есть ли способ сделать URL более красивым?

PS Я не хочуиспользуйте запрос POST, потому что я прочитал, что это плохо для SEO

Ответы [ 3 ]

7 голосов
/ 15 февраля 2012

TLDR: просто оставь это.

HTML-формы сериализуются простым способом; параметры названы в честь элементов HTML. Фактическая проблема здесь в том, как называются элементы формы. Похоже, у них есть имена вроде filter[ShoeBottomType][]; загляните в свой HTML, чтобы увидеть атрибуты name. Поскольку вы находитесь в Rails, я предполагаю, что хэш фильтра передан методу контроллера Rails в качестве единственного аргумента, и поскольку Rails ожидает, что хэши будут использовать определенный URL формат для хэшей и массивов (это должен знать, как десериализовать его из запроса), помощник формы записывает форму таким образом. А ваши особенно сложны, потому что значения хешей являются массивами, отсюда и дополнительный набор скобок. Затем его URL закодирован, и вы в конечном итоге получите ужасный беспорядок.

Вы можете избежать этой проблемы, передавая входы по отдельности обратно в контроллер, а не как большой хэш. Что-то вроде:

def index
  shoe_bottom_types = params[:bottom_types]
  shoe_classifications = params[:classifications]
  shoe_elations = params[:elations]
  ...

, который приведет вас к: /shoes?bottomTypes[]=1&bottomTypes[]=2.... Это не кажется намного лучше, и теперь ваш контролер весь. И я не понимаю, как вы полностью избавитесь от скобок, если хотите иметь более одного фильтра. Полагаю, вы могли бы сойти с ума и выполнить собственный анализ в контроллере, например, разбив shoeBottomTypes=1|2, но тогда вам придется выполнять свою собственную сериализацию форм. Опять же, просто не стоит.

Резервное копирование на секунду, вещи SEO не имеют особого смысла. Поисковые системы не будут заполнять вашу форму; они просто переходят по ссылкам. Настоящая причина, по которой вам следует использовать GET, заключается в том, что (по-видимому) отправка вашей формы не имеет побочных эффектов, поскольку это всего лишь поиск. Смотри здесь ; важно использовать правильные методы HTTP. Если вы используете POST, вы получите странные предупреждения о перезагрузках и не сможете добавить в закладки поиск.

Резервное копирование еще дальше, почему вас это волнует, особенно сейчас, когда SEO выходит за рамки? В качестве быстрой демонстрации я произвел поиск в Google по слову "вещь", и это был URL:

https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=thing&pbx=1&oq=thing&aq=f&aqi=g2g-s1g1&aql=1&gs_sm=3&gs_upl=764l1877l0l1980l6l6l0l0l0l0l89l432l5l5l0&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&fp=220ef4545fdef788&biw=1920&bih=1086

Таким образом, URL-адреса для отправки форм могут быть длинными. Пользователь даже не смотрит на это.

Единственная возможность, которую я могу придумать, почему вы беспокоитесь о длине / уродливости вашего URL-адреса, это то, что вы хотите, отдельно от формы, создавать ссылки на определенные поисковые запросы. Есть несколько способов справиться с этим, но, поскольку я не знаю, имеет ли это отношение к вам, я позволю этому быть продолжением.

Итак, суть в том, что, похоже, я и ожидал, и попытка исправить это звучит безобразно и бессмысленно.

0 голосов
/ 15 февраля 2012

Я предлагаю добавить несколько пользовательских маршрутов, чтобы украсить свои URL.

Например: http://localhost:3001/shoes/Type/2/Classification/1,2/Elation/3,4,5/LiningColor/2,3,4/TopColor/1,2/only_action/1/page/2

Это намного короче, чем ваш первоначальный URL;)

С другой стороны, насколько я знаю, вы должны всегда использовать одинаковый порядок для параметров в вашем URL.

Правило маршрутизации следующее:

match "shoes/Type/:type/Classification/:classification/Elation/:elation/LiningColor/:liningcolor/TopColor/:topcolor/only_action/:only_action/page/:page" => "shoes#show"

Вы можете получить переданные значения в массиве params.Вы должны разделить строку, содержащую ,, чтобы получить несколько значений.

0 голосов
/ 15 февраля 2012

Если вы не хотите использовать запрос POST, тогда нет другого способа поместить значения формы в URL - они должны так или иначе попасть на сервер.

Однако, с другой стороны, я не понимаю, почему делать POST было бы плохо для SEO, и я хотел бы увидеть статью, в которой говорится об этом.

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