我有一个名为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
加上一些基本的错误检查,但这就是我的想法。
希望有帮助!