2

这有效:

基线控制器

@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!某个地方使用吗?

4

3 回答 3

2

令人惊讶的是,尼克很难找到有关高级 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 中学到的其他很酷的东西,所以我将在这里分享它们。

首先,只需很少的工作,您就可以轻松启动keywordsscope_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!”之类的baseline_names。如果名称是“foo”并且描述是“bar”,这甚至会匹配基线;重点是,如果您使用而不是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]),它将调用 newBaselineSearch而不是 Searchlogic::Search 默认值。这里很酷的是,如果你想跳过使用你的BaselineSearch,你可以调用Baseline.searchlogic(params[:search])来使用 Searchlogic 默认值。

于 2010-09-22T01:44:50.923 回答
1

在您的控制器中:

params[:search][:baseline_name_like_or_description_like].strip!
于 2010-07-30T17:27:02.087 回答
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
于 2013-03-08T10:14:46.943 回答