与搜索表单相关的Rails路由

时间:2012-04-08 16:18:33

标签: ruby-on-rails rails-routing

在我最新的网站上,我有一个如下定义的搜索表单:

= form_tag search_path(:termen), :method => :get do
  = text_field_tag :termen, params[:termen]
  = submit_tag "Search »"

一条路线:

# search
get "search(/:termen)" => "articole#cauta", :as => :search

我希望当我按下搜索按钮时可以找到如下网址:

http://www.mysite.com/search/[the_termn_that_was_typed]

所以例如当我在搜索“吸血鬼”时,我应该得到:

http://www.mysite.com/search/vampire

有关此问题的任何线索吗?

非常感谢,

2 个答案:

答案 0 :(得分:6)

我认为RESTful这样做的方法是重新定位已发布的请求以获取您希望它的构造URL的请求。

这是两条路线

resources :articles do
  collection do 
    get :search, :action => 'search_post', :as => 'search_post'
    get 'search/:q', :action => 'search', :as => 'search'
  end
end

现在在控制器中,您将发布请求重定向到获取请求

def search_post
  redirect_to search_articles_path(params[:q])
end

由于提交表单,用户最终会在网址上

http://www.mysite.com/articles/search/vampire

答案 1 :(得分:1)

我不认为你可以直接使用表格来解决这个问题,因为这就是参数的提交方式。你可以用一些javascript来做到这一点。我会提供一个我觉得有点笨重的解决方案,你可以决定它是否值得。

首先是js(使用jQuery):

$(".search_submit").click(function(){
  var button     = $(this);
  var form       = button.closest("form");
  var action     = form.attr("action");
  var text_field = form.find(".search_text");
  var value      = text_field.val();

  window.location = action + "/" + value;
  return false;
});

然后你的视图代码只需添加适当的类:

= form_tag search_path(:termen), :method => :get do
  = text_field_tag :termen, params[:termen], :class => "search_text"
  = submit_tag "Search »", :class => "search_submit"

希望有所帮助。