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

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

2 つ目は、検索フォームを少し追加するだけでサニタイズできることです。これを理解するのにかなりの時間がかかりましたが、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を確認してください。

ここで、モデルで Searchlogic::Search を呼び出す代わりに、baseline.rb で単純なオーバーライドを作成する必要があります。ここでは、独自の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

これで、 を呼び出すと、デフォルトの Searchlogic::Search の代わりにBaseline.search(params[:search])new が呼び出されます。BaselineSearchここですばらしいのは、 の使用をスキップしたい場合は、代わりに Searchlogic のデフォルトを使用するようにBaselineSearch呼び出すことができることです。Baseline.searchlogic(params[:search])

于 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 に答える