2015-01-09 77 views
0

我正在使用Ransack在我的主页上添加一个简单的搜索表单。我希望搜索结果显示在不同的页面上,而不是显示在首页上。在不同的页面显示Ransack搜索结果

HomeController具有index动作与@search变量集如下

def index 
    @search = User.search(params[:q]) 
    @users = @search.result 
end 

该视图包含

<%= search_form_for @search do |f| %> 
    <fieldset> 
    <legend>User</legend> 
    <ul> 
     <li> 
     <%= f.label :first_name_or_last_name_cont %> 
     <%= f.text_field :first_name_or_last_name_cont %> 
     </li> 
     <li> 
     <%= f.label :email_cont %> 
     <%= f.text_field :email_cont %> 
     </li> 
    </ul> 
    </fieldset> 

    <fieldset> 
    <legend>User's Posts</legend> 
    <ul> 
     <li> 
     <%= f.label :posts_title_cont %> 
     <%= f.text_field :posts_title_cont %> 
     </li> 
    </ul> 
    </fieldset> 

    <%= f.submit %> 
<% end %> 

<%= render 'results' %> 

如何可以设置控制器,这样我可以在不同的使用<%= render 'results' %>查看不同的动作,说一个search的动作?我该如何做到这一点,以便当我提交搜索表单时,我被引导到显示搜索结果的search操作的新页面?

回答

0

伟大的问题!要回答你的问题,你可以创建一个带有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

相关问题