0

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

<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=✓&amp;query=eats,当我从完美运行的真实搜索页面搜索时,它看起来像这样localhost:3000/search?utf8=✓&amp;query=eats。无论从哪里搜索,我怎样才能让它指向后一个 url?

4

3 回答 3

2

这是因为你有一个嵌套的形式。

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

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

于 2013-08-16T20:48:38.250 回答
1

你为什么不为你的搜索控制器做一个正确的路由条目?

resources :search_results, :only => :index

然后在你的搜索表单中让它 POST 到searches_path. 然后你不必摆弄这个:match路由。

编辑

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

resources :searches_results do
  post :query
end

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

编辑 2

而且我认为这里真正的问题是您在表单标签中有一个表单标签。第一个表单标签被评估,它可能指向/. 因此它可以在控制器本身中工作,但不能在其他任何地方工作。

于 2013-08-16T20:26:50.587 回答
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)
于 2013-08-16T13:04:42.913 回答