【问题标题】:Select_tag with elasticsearch使用弹性搜索选择标签
【发布时间】:2017-01-04 19:24:07
【问题描述】:

我尝试传递 2 个搜索选项。第一个 [:q] 用于访问者的输入文本,另一个来自模型露营“nomdep”(如英语中的部门)。当我尝试通过输入进行搜索时,它可以工作,但是由于我尝试添加 select_tag 我有一个错误

错误 nil:NilClass 的未定义方法 `map'

我迷路了,你有什么想法吗?

对不起我的英语,我是法语。

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] 为空,则搜索不起作用。所以如果我只选择标签 => 没有结果。

如何解决这个问题?

我的完整 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>

【问题讨论】:

    标签: ruby-on-rails forms search elasticsearch ruby-on-rails-5


    【解决方案1】:

    我想对@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 %>
    

    【讨论】:

      【解决方案2】:
      @camping = Camping.all
      

      除非 :q 在参数中传递给索引操作,否则此变量将为 nil。 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
      

      【讨论】:

      • 感谢@Baradzed,但完全没有效果。我可以显示主页但有两件事。 1) 部门名称不显示我只有这个 ... 2) 当我提交搜索时 [:q] 为空并选择关联我没有结果。那么我能做些什么来解决这个问题呢?
      • 我编辑我的主题以添加def结果,我该如何进行搜索工作?
      • 解决点 (1):Rails 不知道 Camping 对象的哪些属性构成选择选项的值和文本。您可以使用另一个助手并指定这些属性,例如:options_from_collection_for_select(@camping, :id, :nomdep)
      • 很好,解决了问题 1. 搜索不适用于空参数 [:q] 如何解决这个问题?网址看起来像这样localhost:3000/result?utf8=%E2%9C%93&nomdep=6&q=
      • 上面帮助器的最后两个参数是指定选项的值和文本。您应该选择它们以适合您的模型。我的猜测是,对于这个搜索框,@camping, :nomdep, :nomdep 可能是您需要的。
      猜你喜欢
      • 2021-03-08
      • 2021-08-27
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多