rails搜索表单适用于所有应用程序页面

时间:2013-08-16 10:49:29

标签: ruby-on-rails search ruby-on-rails-3.2

我有一个搜索表单,显示在所有页面上,因为我希望有人能够搜索并重定向到搜索结果,无论他们在网站上的位置。为了实现这一点,我将表单放在部分中,我将其包含在应用程序布局中。看起来像这样

<form class="form-search center">
 <%=form_tag search_url, method: :get do%>
 <%=text_field_tag :query, params[:query] ,{:class=>"input-xxlarge search-query"}%>
 <button type="submit" class="btn">Search</button>
<%end%>
</form>

我创建了一个名为SearchResults的控制器,其中包含索引操作以显示结果。 命名路线如下所示

match '/search',  to: 'search_results#index'

在搜索页面上搜索工作完全正常,但在其他任何地方都无法正常工作。我的索引操作看起来像这样

class SearchResultsController < ApplicationController
 def index
  @restaurants =  Restaurant.text_search(params[:query]).page(params[:page]).per_page(3)

 end
end 

无论我在应用程序中的哪个位置,每当我执行搜索时,我都希望能够重定向到此操作.text_search方法在餐厅模型中定义如此

def self.text_search(query)
if query.present?
  where("restaurant_name ilike :q or description ilike :q", q: "%#{query}%")

else
  scoped    
end

当我搜索没有任何反应时,它无法正常工作,但如果我转到搜索页面则会返回结果。

我注意到一些有趣的事情。当我从主页搜索像吃的一样的术语时。该网址看起来像localhost:3000/?utf8=✓&query=eats,当我从真正完美的搜索页面搜索时,它看起来像localhost:3000/search?utf8=✓&query=eats。我怎样才能指出后者的网址,无论我在哪里搜索?

3 个答案:

答案 0 :(得分:2)

因为你有一个嵌套的表格。

<form class="form-search center">
  <%=form_tag search_path do%>

摆脱原始HTML中的form,让Rails通过第二行的帮助器生成它。

答案 1 :(得分:1)

为什么不为搜索控制器进行正确的路由输入?

resources :search_results, :only => :index

然后在搜索表单中,您将其POST到searches_path。然后,您不必使用此:match路由。

修改

我也注意到你GET你的表格。从技术上讲,它并不重要,但它不是很干净。也许,你可以这样做:

resources :searches_results do
  post :query
end

然后在您的控制器中,您只需拥有query功能。

修改2

我认为这里真正的问题是你在表单标签中有一个表单标签。第一个表单标记被评估,它可能指向/。因此它适用于控制器本身,但不适用于其他任何地方。

答案 2 :(得分:0)

对于我的情况,我使用这样的东西:在视图中

<%= form_tag url_for(:controller => '/searchresults', :action => 'index')  , :method => 'get' do %>
  <%= text_field_tag :query, params[:query] ,{:class=>"input-xxlarge search-query"} %>
  <%= submit_tag 'search' %>
<% end %>

和模型

  q = "%#{params[:query]}%"
  where("restaurant_name LIKE ? or description LIKE ?", q, q)