rails从searchlogic文本字段修剪空格

时间:2010-07-30 17:07:53

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

这有效:

基线控制器

@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!吗?

3 个答案:

答案 0 :(得分:2)

Nick,令人惊讶的是,很难找到有关高级Searchlogic技术的信息。我很难处理消毒问题。

这是处理问题的一种非常好的(快速)方法。

控制器

保持不变

视图/基线/ index.html.erb

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

模型/ 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+/))
}

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

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

其次,您可以稍加努力地清理搜索表单。这个花了很长时间才搞清楚,但我决定创建一个Searchlogic :: Search类的子类。 看看:

模型/ 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

模型/ 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默认值。

答案 1 :(得分:1)

在您的控制器中:

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

答案 2 :(得分:0)

或者,在您的应用中删除所有搜索,将其放入ApplicationController

before_filter :strip_search_parameters      

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