Рельсы обрезают пробелы из текстового поля searchlogic - PullRequest
2 голосов
/ 30 июля 2010

Это работает:

Базовый контроллер

@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 ]

2 голосов
/ 22 сентября 2010

Ник, на удивление, довольно сложно найти информацию о продвинутых методах Searchlogic.Санитарная обработка была для меня особенно трудной.

Вот довольно изящный (и быстрый) способ справиться с вашей проблемой.

контроллер

остается прежним

views / baselines / 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" и совпадать с baseline_names как "я могу foo haz bar "или" bar time, foo! "Это даже соответствовало бы базовой линии, если бы имя было «foo», а описание было «bar»;в сущности, вы получаете тонны дополнительного контроля, если вы используете scope_procedure вместо предопределенного named_scope в формах Searchlogic.

Во-вторых, вы можете санировать свои поисковые формы с небольшими дополнительными усилиями.Чтобы понять это, потребовалось много времени, но я решил создать подкласс класса 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 :: Реализация

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 по умолчанию.

1 голос
/ 30 июля 2010

В вашем контроллере:

params[:search][:baseline_name_like_or_description_like].strip!
0 голосов
/ 08 марта 2013

Или для удаления всех поисков в вашем приложении, поместите это в ApplicationController

before_filter :strip_search_parameters      

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