2016-08-28 23 views
1

我嘗試傳遞2個搜索選項。第一個[:q]用於訪問者的輸入文本,另一個來自模型露營「nomdep」(如英文部分)。當我嘗試通過輸入搜索它的作品,但因爲我嘗試添加select_tag我有一個錯誤帶elasticsearch的Select_tag

錯誤 未定義的方法'地圖」的零:NilClass

我迷路了,做ü有什麼想法?

對不起,我是法國人。

Home_controler.rb

def index 
     if params[:q].nil? 
     "Entrez un mot clef" 
     else 
     @campings = Camping.__elasticsearch__.search params[:q,:nomdep] 
     @camping = Camping.all 
    end 
    end 

def result 
     if params[:q].nil? 
     @campings = [] 
     else 
     @campings = Camping.__elasticsearch__.search(params[:q]).page(params[:page]).per(14).results 
     end 
end 

查看

<div class="search"> 
     <%= form_tag(result_path, method: :get) %> 
     <%= text_field_tag :q, params[:q], class:"search-query form-control" %> 
        <%= select_tag(:nomdep, options_for_select(@camping)) %> 

       <%= submit_tag "Partez", class:"btn btn-danger", name: nil %> 
    </div> 

編輯 現在我沒有任何錯誤,但搜索不工作,如果[:Q]空。所以,如果我只select_tag =>沒有結果。

這是怎麼解決的?

我的全home_controller.rb

class HomeController < ApplicationController 
    def index 
     @camping = Camping.all 
     if params[:q].nil? 
     "Entrez un mot clef" 
     else 
     @campings = Camping.__elasticsearch__.search params[:q, :nomdep] 
    end 
    end 

    def result 
     if params[:q].nil? 
     @campings = [] 
     else 
     @campings = Camping.__elasticsearch__.search(params[:q]).page(params[:page]).per(14).results 
     end 

end 
end 

我看來

<div class="search"> 
      <%= form_tag(result_path, method: :get) %> 
         <%= select_tag :nomdep, options_from_collection_for_select(@camping, :id, :nomdep), prompt: "Département" %> 
        <%= text_field_tag :q, params[:q], class:"search-query form-control" %> 
        <%= submit_tag "Partez", class:"btn btn-danger", name: nil %> 
     </div> 

回答

1
@camping = Camping.all 

這個變量將是零,除非:●在PARAMS索引行動傳遞。 options_for_select(@camping)將嘗試對此變量調用#map,並在未初始化時引發錯誤。

你應該確保它被初始化。例如,嘗試重寫你的動作:

def index 
     @camping = Camping.all 
     if params[:q].nil? 
     "Entrez un mot clef" 
     else 
     @campings = Camping.__elasticsearch__.search params[:q] 
     end 
end 
+0

感謝@Baradzed但沒有作品完全。我可以顯示頁面主頁,但有兩件事。 1)部門的名字不顯示我只有這個<露營%3A0X9F9C888> ... 2)當我提交搜索與[:Q]空和選擇協會我沒有結果。那麼我能做些什麼來解決這個問題? – nicolaswecandoit

+0

我編輯我的主題添加def結果,我該如何做搜索工作? – nicolaswecandoit

+0

要解決點(1):Rails不知道Camping對象的哪些屬性構成選擇選項的值和文本。你可以使用另一個幫助器,並指定這些屬性,例如:'options_from_collection_for_select(@camping,:id,:nomdep)' – Baradzed

0

我想對@Baradzed說一個大的大感謝!我們昨天談到了,他找到了一個完美的解決方案!

home_controller.rb

class HomeController < ApplicationController 
    def index 
     @camping = Departement.all 
     if params[:q].blank? || params[:nomdep].blank? 
     @campings = Camping.__elasticsearch__.search params[:nomdep] 
     else 
     @campings = Camping.__elasticsearch__.search params[:q] 

    end 
    end 



    def result 

    querystring = params.slice(:nomdep, :other_param, :any_params_except_q_because_we_will_process_q_separately) 
    .select{|k,v| v.present?} 
    .map {|key, value| "#{key}:\"#{value.gsub(/([#{Regexp.escape('\\+-&|!(){}[]^~*?:/')}])/, '\\\\\1') }\""} 
    .join(" AND ") 

    freetext = params[:q] 
    freetext.gsub!(/([#{Regexp.escape('\\+-&|!(){}[]^~*?:/')}])/, '\\\\\1') 

    querystring = ["*#{freetext}*",querystring].select{|v| v.present?}.join(" AND ") if params[:q].present? 

    if querystring.blank? 
    flash[:notice] = "Aucune mots clefs" 
    redirect_to action: :index and return 
    else 
    @campings = Camping.__elasticsearch__.search(
    query: { query_string: { 
    query: querystring 
    }}).page(params[:page]).per(14).results 
    end 


     @hash = Gmaps4rails.build_markers(@campings) do |camping, marker| 
      marker.lat camping.latitude 
      marker.lng camping.longitude 
      marker.infowindow render_to_string(:partial => "/campings/infowindow", :locals => { :camping => camping}) 
      marker.picture ({ 
      "url" => "http://avantjetaisriche.com/map-pin.png", 
      "width" => 29, 
      "height" => 32}) 
     end 
end 
end 

視圖

<div class="search"> 
      <%= form_tag(result_path, method: :get) %> 
         <%= select_tag :nomdep, options_from_collection_for_select(@camping, :nomdep, :nomdep), prompt: "Département" %> 
        <%= text_field_tag :q, params[:q], class:"search-query form-control" %> 
        <%= submit_tag "Partez", class:"btn btn-danger", name: nil %>