隐藏params哈希并用更干净的URL替换它

时间:2011-01-05 07:33:30

标签: ruby-on-rails ruby-on-rails-3 params

在Rails中获取请求之后生成的默认URL不是很好看。

在Rails 3应用程序中使用meta_search gem,我创建了一个选择菜单,按类别过滤文章列表。代码如下所示:

<%= 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>

现在,提交表单时,会返回一个包含params散列的冗长URL:

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

我希望尽可能保持网址清晰,例如:

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

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

有哪些解决方案可以让params hash URL更易被人类阅读?

2 个答案:

答案 0 :(得分:1)

使用get方法的表单不能这样做。这是一个HTML问题。

您需要添加一些Javascript才能将您的网址转换为漂亮的网址,或者您可以在rails应用中的控制器中获取网址并重定向到漂亮的网址。

答案 1 :(得分:0)

像shingara所说的那样,根本不要使用表格。而是使用一个链接列表,并使用一些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下拉菜单的例子......除非你放弃再次询问有关堆栈溢出的建议:-)。 (从头开始编写标准UI组件的基本版本很简单,现在使用jQuery等等,所以很多人都这样做。编写“感觉正确”的实际上很难;更少的人这样做!)

P.S。那form_for @search看起来非常奇怪。这不是form_for @your_model_object的意思......