2015-01-09 113 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

相關問題