Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我应该如何路由搜索模式?不同的资源?一种资源?多重行动?_Ruby On Rails_Search_Resources_Routing - Fatal编程技术网

Ruby on rails 我应该如何路由搜索模式?不同的资源?一种资源?多重行动?

Ruby on rails 我应该如何路由搜索模式?不同的资源?一种资源?多重行动?,ruby-on-rails,search,resources,routing,Ruby On Rails,Search,Resources,Routing,我有一个名为Cimgs的资源 你可以在#索引中看到它们 可以通过Sphinx按内容进行搜索 也可以通过标签进行搜索 并且可以由另一个相关的Cimg进行搜索,检查标签冲突 这是我的问题:哪一种方法更好? 我是否应该向#索引传递一个额外的参数并相应地搜索该参数?毕竟,它们都使用相同的视图。 还是应该为每个搜索方法创建一个操作? 或者是整个资源 我目前正在做以下工作: resources :cimgs, path: 'pics' do collection do get 'se

我有一个名为Cimgs的资源 你可以在#索引中看到它们 可以通过Sphinx按内容进行搜索 也可以通过标签进行搜索 并且可以由另一个相关的Cimg进行搜索,检查标签冲突

这是我的问题:哪一种方法更好? 我是否应该向#索引传递一个额外的参数并相应地搜索该参数?毕竟,它们都使用相同的视图。 还是应该为每个搜索方法创建一个操作? 或者是整个资源

我目前正在做以下工作:

  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/:page。(我不知道它用来检测页面/: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

我会让他们在一个单一的行动。我的假设是,最终,您将决定组合您的搜索方法是有用的(“我想要一个与另一个图像相关的图像,但标记为‘番茄酱’”)。如果您有一个单独的操作来处理所有的搜索,那么这将很容易做到,但是如果您有单独的操作,那么要困难得多——或者至少涉及大量重复的代码

我在我工作的网站上做了类似的事情。我将主搜索散列作为
参数[:search]
,然后在该散列中包含每个单独的搜索项。然后,由于我为每个搜索选项创建了一个命名的_范围(在Rails 3中可能是不同的名称),因此我可以执行以下操作:

scope = MyModel.scoped
params[:search].each_pair do |key, value|
    scope = scope.send(key, value)
end
@models = scope.all
加上一些基本的错误检查,但这就是想法

希望有帮助