我应该如何路由搜索模式?不同的资源吗?一个资源?多个动作



我有一个名为imgs的资源你可以在#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

我会把它们都放在一个动作中。我的假设是,最终,您将决定组合您的搜索方法是有用的("我想要一个与另一个图像相关的图像,但带有'ketchup'标签。")。如果你已经有一个处理所有搜索的单一操作,这将很容易做到,但如果你有单独的操作,这就困难得多了——或者至少涉及大量重复的代码。

我在一个我正在工作的网站上做类似的事情。我取一个主搜索哈希作为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

加上一些基本的错误检查,但这就是我的想法。

希望有帮助!