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

时间:2011-10-07 14:30:26

标签: ruby-on-rails search resources routing

我有一个名为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 :(得分:0)

我会把它们全部放在一个动作中。我的假设是,最终,你将决定结合你的搜索方法是有用的(“我想要一个与这个其他图像相关的图像,但是标签'番茄酱'。”)。如果您只有一个处理所有搜索的操作,那么这很容易做到,但是如果您有单独的操作,则会更加困难 - 或者至少涉及大量重复的代码。

我在我正在制作的网站上做类似的事情。我将主搜索哈希值设为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

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

希望有所帮助!