Как удалить аргумент действия из функции Rails link_to? - PullRequest
0 голосов
/ 27 апреля 2010

Не уверен, как создать это, так что здесь идет ...

У меня есть следующий тег link_to:

<%= link_to("My test title",{:controller=>"search", :action=>"for-sale", :title => listing.title, :search_term => search_term, :id=> listing.id}) %>

и следующий пользовательский маршрут в моем файле rout.rb:

map.connect ':controller/:action/:title/search_item/:id', :controller=>'search', :action=>'for_sale' 

, который генерирует очень хороший SEO дружественный URL:

/search/for-sale/sometitle/searchterm/123456

Как я могу удалить параметр: action из обоих, проблема в том, что я убрал опцию: action и изменил свой тег link_to на:

<%= link_to("My test title",{:controller=>"search", :title => listing.title, :search_term => search_term, :id=> listing.id}) %>

и мой собственный маршрут к:

map.connect ':controller/:title/search_item/:id', :controller=>'search', :action=>'for_sale' 

Сгенерированный URL больше не является SEO-дружественным и очень уродливым:

/search?title=test&search_term=test&id=1141409

Мой пользовательский маршрут перенаправляет на правильное действие в контроллере, поэтому нет необходимости, чтобы опция действия была в URL. Каждый раз, когда я удаляю или переименовываю опцию: action во что-то другое - URL-адрес «искажается», знаете, как я могу это сделать?

Пробовал несколько вариантов, но, похоже, ничего не работает.

Спасибо!

1 Ответ

3 голосов
/ 28 апреля 2010

Во-первых, ваш маршрут ':controller/:title/search_item/:id' не имеет параметра :search_term, но вы пытаетесь передать его в link_to :search_term => search_term

Во-вторых, если вы всегда используете контроллер 'search', вам не нужно передавать его в качестве параметра.

Итак, ваш маршрут, вероятно, станет 'search/:title/:search_term/:id'

Также попробуйте использовать именованные маршруты:

map.search 'search/:title/:search_term/:id', :controller=>'search', :action=>'for_sale'

<%= link_to("My test title", search_path(listing.title, search_term, listing.id)) %>

Редактировать: необязательные параметры

Можно указать значение по умолчанию для параметров в конце маршрута.

Итак, если вы установите

map.search 'search/:title/:search_term/:id', :controller=>'search', :action=>'for_sale', :id => nil, :search_term => nil

Вы можете создать URL без идентификатора: search_path(listing.title, search_term) Или без идентификатора и search_term: search_path(listing.title)

Если вы хотите сделать необязательным :search_term, укажите в конце маршрута:

map.search 'search/:title/:id/:search_term', :controller=>'search', :action=>'for_sale', :search_term => nil
...