Ruby on rails 我应该如何路由搜索模式?不同的资源?一种资源?多重行动?
我有一个名为Cimgs的资源 你可以在#索引中看到它们 可以通过Sphinx按内容进行搜索 也可以通过标签进行搜索 并且可以由另一个相关的Cimg进行搜索,检查标签冲突 这是我的问题:哪一种方法更好? 我是否应该向#索引传递一个额外的参数并相应地搜索该参数?毕竟,它们都使用相同的视图。 还是应该为每个搜索方法创建一个操作? 或者是整个资源 我目前正在做以下工作: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
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
加上一些基本的错误检查,但这就是想法
希望有帮助