在不同的页面上显示Ransack搜索结果

时间:2015-01-09 12:22:32

标签: ruby-on-rails 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操作的新页面?

1 个答案:

答案 0 :(得分:0)

好问题!要回答您的问题,您可以创建一个私有方法,其中redirect_to是一个不同的页面(具有&lt;%= render'结果'%&gt ;;)IF搜索参数在您的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

但是,如果您想开始构建应用,则无论您在应用中的位置,都希望搜索结果显示在该专用页面上。我正在从一个小型应用程序中完整回答。代码只是略有不同(form_tag而不是search_form_for),但我知道它有效,所以希望它会对你有帮助。

下面是在应用程序中显示的导航栏部分,然后是主页和ListingController索引操作的相关代码。如果传递了搜索参数,则index.html.erb会将@listings部分(_listing.html.erb)呈现为&lt;%else%&gt;在主页上标记。

_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'(/ listings?utf8 =%E2%9C%93&amp; search = cheese)。请注意%E2%9C%93 ...您可能看不到这个b / c这通常显示为浏览器上的URL(http://unicode-search.net/unicode-namesearch.pl?term=mark)...so只需将其粘贴到文本管理器或stackoverflow文本区域即可获得如上所示'完整网址'。然后在网址的末尾,只需用#{search_params}替换您在搜索框中输入的内容。

这会将搜索框中输入的内容传递到您的专用搜索结果页面(在我的情况下为index.html.erb)!

以下是有关CGI escapeHTML的一些文档(出于安全原因):http://ruby-doc.org/stdlib-2.0/libdoc/cgi/rdoc/CGI.html#method-c-escapeHTML