这有效:
@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!
吗?
答案 0 :(得分:2)
Nick,令人惊讶的是,很难找到有关高级Searchlogic技术的信息。我很难处理消毒问题。
这是处理问题的一种非常好的(快速)方法。
保持不变
<% form_for @search do |f| %>
<%= f.text_field :keywords %>
<%= submit_tag 'Search' %>
<% end %>
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类的子类。 看看:
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
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