Скрыть хэш параметров и заменить его более чистым URL - PullRequest
2 голосов
/ 05 января 2011

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

Используя гем meta_search в приложении на Rails 3, я создал меню выбора для фильтрации списка статей по категориям. Код выглядит так:

<%= form_for @search, :url => articles_path, :html => {:method => :get} do |f| %>
  <%= f.label :category_name_equals, "Filter by category:" %>  
  <%= f.collection_select :category_name_equals, 
    Category.all(:order => "name"), :name, :name, :include_blank => true %> 
  <%= f.submit "Search" %>
<% end %>

<table>  
  <tr>  
    <th>Title</th>  
    <th>Category</th>  
  </tr>  
  <% for article in @articles %>  
  <tr>  
    <td><%= link_to article.title, article %></td> 
    <td><%= article.category.name %></td>
  </tr>  
  <% end %>  
</table>

Прямо сейчас, когда форма отправлена, возвращается длинный URL-адрес, содержащий хэш параметров:

http://localhost:3000/articles?utf8=%E2%9C%93&search[category_name_equals]=
Reviews&commit=Search

Я хочу, чтобы URL был максимально чистым, например:

http://localhost:3000/articles/category/reviews 

или

http://localhost:3000/articles?category=reviews

Какие существуют решения, чтобы сделать URL-адрес хэш-функции более читабельным для людей?

Ответы [ 2 ]

1 голос
/ 05 января 2011

Вы не можете сделать это с формой с помощью метода get.это проблема HTML.

Вам нужно добавить Javascript, чтобы преобразовать ваш URL в красивый URL, или вы можете получить URL в вашем контроллере в приложении rails и перенаправить на ваш красивый URL.

0 голосов
/ 11 января 2011

Как сказал Шингара, не используйте форму вообще. Вместо этого используйте список ссылок и добавьте некоторые CSS / JS, которые делают ваш список похожим на выпадающее меню:

<ul>
  <% Category.all.each do |c| %>
    <li>
      <%= link_to(c.name, :controller => :articles, :action => :browse, :category => c.tag) %>
    </li> 
  <% end %>
</ul>

Для ваших маршрутов вам понадобится что-то подобное, но DRYer:

routes.connect '/articles/browse/:category', :controller => :articles, :action => :browse

Вы можете легко найти множество примеров выпадающих списков CSS / JS: http://bit.ly/dRtQNd

Вы можете найти примеры хороших CSS / JS выпадающих меню со значительно большими усилиями ... если только вы не сдадитесь, просто попросите совета по переполнению стека снова :-). (Кодировать элементарные версии стандартных компонентов пользовательского интерфейса с нуля очень просто в наши дни с использованием jQuery и еще чего-то, поэтому многие люди делают это. Кодировать те, которые «чувствуют себя хорошо», на самом деле очень сложно; меньше людей делают это!)

P.S. Это form_for @search выглядит очень странно. Это не то, для чего form_for @your_model_object предназначался ...

...