伟大的问题!要回答你的问题,你可以创建一个带有redirect_to不同页面的私有方法(它具有<%= render'results'%>)如果搜索参数在你的HomeController中传递。
class HomeController < ApplicationController
before_action :search
def index
@search = User.search(params[:q])
@users = @search.result
end
private
def search
if params[:q]
search_params = CGI::escapeHTML(params[:q])
redirect_to (url --> see below how to get the url)
end
end
end
但是,如果你想开始建立你的应用程序,你希望你的搜索结果中显示的是专用页面,无论你在哪里,在应用上。我正在从一个小型Rails应用程序中完整地回答问题。代码只是略有不同(form_tag,而不是search_form_for),但我知道它的工作原理,所以希望它能帮助你。
下面是一个横跨应用程序显示的导航栏部分,然后是主页和ListingController索引操作的相关代码。如果传递了搜索参数,那么index.html.erb会呈现@listings部分(_listing.html.erb),并且不会在主页上的<%else%>标记之下显示任何内容。
_navigation.html.erb
<%= form_tag search_path, :method => :get do %>
<div class="form-group">
<%= text_field_tag :search, params[:search], class: "form-control", placeholder: "Search" %>
</div>
<%= submit_tag "Submit", :name => nil, :class => "btn btn-primary" %>
<% end %>
index.html.erb
<% if params[:search] %>
<h2>Search Results</h2>
<%= render @listings %>
<% else %>
...what usually shows up on my home page with no search results.
<% end %>
listings_controller
def index
@listings = Listing.search(params[:search])
end
的routes.rb
get 'search' => "listings#search"
这很好。但是,如果我处于不同的视图/控制器中,如显示所有类别的视图/控制器,并尝试搜索,则它基本上会搜索当前页面。所以,我增加了以下的类别控制器:
categories_controller
before_action :search
......
private
def search
if params[:search]
search_params = CGI::escapeHTML(params[:search])
redirect_to ("/listings?utf8=%E2%9C%93&search=#{search_params}")
end
end
但是,对于特定的应用程序,以获得搜索重定向到主页并显示搜索结果,第一个做搜索在您的主页上查看网址中生成的内容。假设我输入'cheese'(/ listing?utf8 =%E2%9C%93 & search = cheese)。注意%E2%9C%93 ...你可能看不到这个b/c,这通常显示为你的浏览器中的url检查(http://unicode-search.net/unicode-namesearch.pl?term=mark)...so只是将其粘贴到文本处理程序或stackoverflow文本区域以获取'完整的url'就像上面那样,然后在url结尾处,用#{search_params}替换您在搜索框中输入的内容。
这会将搜索框中键入的内容传递给您的专用搜索结果页面(在我的案例中为index.html.erb)!
这里是关于CGI escapeHTML的一些文档(出于安全原因):http://ruby-doc.org/stdlib-2.0/libdoc/cgi/rdoc/CGI.html#method-c-escapeHTML