【问题标题】:rails trim whitespace from searchlogic text fieldrails 从 searchlogic 文本字段中修剪空白
【发布时间】:2010-07-30 17:07:53
【问题描述】:

这行得通:

基线控制器

@search = Baseline.search(params[:search])

@baselines = @search.paginate :page => params[:page], :per_page => params[:per_page]

基线索引视图

<% form_for @search do |f| %>
  <%= f.text_field :baseline_name_like_or_description_like %>
  <%= submit_tag 'Search' %>
<% end %>

我将在哪里修剪text_field 中的前导和尾随空格?我可以在某处使用.strip! 吗?

【问题讨论】:

    标签: ruby-on-rails plugins searchlogic removing-whitespace


    【解决方案1】:

    Nick,令人惊讶的是,很难找到有关高级 Searchlogic 技术的信息。消毒对我来说特别困难。

    这是处理您的问题的一种非常漂亮(且快速)的方法。

    控制器

    保持不变

    视图/基线/index.html.erb

    <% form_for @search do |f| %>
      <%= f.text_field :keywords %>
      <%= submit_tag 'Search' %>
    <% end %>
    

    models/baseline.rb

    class Baseline < ActiveRecord::Base
      scope_procedure :keywords, lambda { |query|
        baseline_name_like_or_description_like(query.strip)
      }
    end
    

    附加功能

    我很高兴能分享我在 Searchlogic 中学到的其他很酷的东西,所以我会在这里分享。

    首先,只需很少的工作,您就可以轻松启动keywords scope_procedure。

    scope_procedure :keywords, lambda { |query|
      baseline_name_like_any_or_description_like_any(query.strip.split(/\s+/))
    }
    

    注意any 运算符添加到每个named_scope

    这将允许您输入诸如“foo bar”之类的搜索,并且它将匹配诸如“i can foo haz bar”或“bar time, foo!”之类的基线名称。如果名称是“foo”并且描述是“bar”,这甚至会匹配基线;重点是,如果您在 Searchlogic 表单中使用 scope_procedure 而不是预定义的 named_scope,您将获得大量额外的控制权。

    其次,您可以通过一些额外的努力来清理您的搜索表单。这个花了很长时间才弄清楚,但我决定创建 Searchlogic::Search 类的子类。 看看吧:

    models/baseline_search.rb

    class BaselineSearch < Searchlogic::Search
      def initialize(params, klass, current_scope)
    
        allowed_params = [:keywords, :name_like_any, :foo_equals, :order]
    
        conditions = {}
    
        for x in allowed_params 
          conditions[x] = params[x] unless params[x].blank?
        end
    
        super(klass, current_scope, conditions)
      end
    end
    

    如果您想知道我在哪里找到 initialize 方法签名,请查看 Searchlogic::Search

    现在,您需要在baseline.rb 中创建一个简单的覆盖,而不是在您的模型上调用Searchlogic::Search。在这里,我们将实现我们自己的Searchlogic::Search::Implementation

    models/baseline.rb

    class Baseline < ActiveRecord::Base
    
      # cool scope procedures
      # ...
    
      def self.search(params={})
        BaselineSearch.new(params || {}, self, scope(:find))
      end
    end
    

    现在,当您调用 Baseline.search(params[:search]) 时,它将调用新的 BaselineSearch,而不是 Searchlogic::Search 默认值。这里很酷的是,如果你想跳过使用 BaselineSearch,你可以调用 Baseline.searchlogic(params[:search]) 来使用 Searchlogic 默认值。

    【讨论】:

    • 好棒!这是很棒的东西,我敢打赌我会在某个时候使用所有这些!
    【解决方案2】:

    在您的控制器中:

    params[:search][:baseline_name_like_or_description_like].strip!
    

    【讨论】:

    • 这行得通,除非他们要访问主 URL:example.com/baselines 它提出了评估 nil 时发生的错误。[] 我应该在它周围加上 if 结束还是一个除非?跨度>
    • 是的。如果 params[:search] params[:search][:baseline_name_like_or_description_like].strip!结束 @search = Baseline.search(params[:search])
    • 参数[:search][:baseline_name_like_or_description_like].strip! if params[:search] && params[:search][:baseline_name_like_or_description_like]
    • 再次检查它并不起作用..见下文:在搜索过程中:strip取出空白并显示:参数:{“commit”=>“Search”,“action” =>"index", "controller"=>"baselines", "search"=>{"order"=>"", "device_id"=>"", "baseline_name_like_or_description_like"=>"build"}} (这使得感觉正确)然后结果返回并显示所有基线,并且文本字段中没有搜索字符串。这似乎与搜索逻辑有关?
    • 不确定这是什么意思:“然后结果返回并显示所有基线,并且文本字段中没有搜索字符串。”
    【解决方案3】:

    或者为了去除应用中的所有搜索,将其放入 ApplicationController

    before_filter :strip_search_parameters      
    
    def strip_search_parameters
      return if params[:search].blank?
      params[:search].each_value {|val| val.strip!}
      return
    end
    

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 2011-03-22
      • 2018-08-26
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多