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