我有一个搜索表单,显示在所有页面上,因为我希望有人能够搜索并重定向到搜索结果,无论他们在网站上的位置。为了实现这一点,我将表单放在部分中,我将其包含在应用程序布局中。看起来像这样
<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
。我怎样才能指出后者的网址,无论我在哪里搜索?
答案 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)