Как я должен маршрутизировать режимы поиска? Разные ресурсы? Один ресурс? Несколько действий? - PullRequest
1 голос
/ 07 октября 2011

У меня есть ресурс с именем Cimgs. Вы можете увидеть их в #index. Их можно искать по содержимому, через Sphinx. Также можно искать по тегам. И можно искать по другому связанному Cimg, проверяя наличие коллизий тегов.

И вот мой вопрос: какой способ лучше всего это проложить?Должен ли я передать дополнительный параметр в #index и выполнить поиск по параметру?Ведь они все используют один и тот же вид.Или я должен создать действие для каждого метода поиска?Или, может быть, целый ресурс?

В настоящее время я делаю следующее:

  resources :cimgs, path: 'pics' do
    collection do
      get 'search(/:q)', action: :index, search_by: :content, as: :search_by_content
      get 'tags/:tag',   action: :index, search_by: :tags,    as: :search_by_tag
      get 'page/:page', action: :index
    end

    member do
      get 'related', action: :index, search_by: :related, as: :search_by_related
    end
  end

  root :to => 'cimgs#index'

Проблема в том, что я использую Kaminari для подкачки страниц, и он не обнаруживает страницу /: страница для другого маршрута, кроме корневого.(На самом деле я не знаю механизм, который он использует для обнаружения страницы /: page)

А вот мое действие контроллера:

  def index
    @cimgs = case params[:search_by]
      when :content; Cimg.content_search     params[:q],   params[:page], request.remote_ip
        return redirect_to @cimgs[0] if @cimgs.length == 1
      when :tag;     Cimg.search_by_tag      params[:tag], params[:page]
      when :related; Cimg.search_related_to  params[:id],  params[:page]
      else;          Cimg.get_for_front_page               params[:page]
    end

    render :index
  end

1 Ответ

0 голосов
/ 07 октября 2011

Я бы держал их всех в одном действии. Я предполагаю, что в конечном итоге вы решите, что полезно объединить методы поиска («Я хочу изображение, которое связано с этим другим изображением, но имеет тег« кетчуп ».). Это будет легко сделать, если у вас есть одно действие, которое уже обрабатывает все ваши запросы, но гораздо сложнее - или, по крайней мере, с использованием большого количества дублирующегося кода - если у вас есть отдельные действия.

Я делаю нечто подобное на сайте, над которым работаю. Я принимаю основной хэш поиска как params[:search], а затем включаю каждый отдельный поисковый термин в этот хэш. И затем, поскольку я создал named_scope (может быть другое имя в Rails 3) для каждой опции поиска, я могу сделать что-то вроде:

scope = MyModel.scoped
params[:search].each_pair do |key, value|
    scope = scope.send(key, value)
end
@models = scope.all

Плюс некоторая базовая проверка ошибок, но это идея.

Надеюсь, это поможет!

...