在ReSTful rails模型中搜索操作

时间:2012-03-23 16:57:06

标签: ruby-on-rails ruby-on-rails-3 rest

所以,我对Rails很陌生,并且仍在努力完成这些原则。我想和大多数人一样,我已经开始创建那个基本的CRUD了。好的。完成。

现在我想要一个新动作:搜索。事实证明,它不是7个休息神圣(!)动作之一(如果做对了)。虽然我知道我可以实现新的自定义操作并为其提供资源,但我会在一些地方阅读,尽可能地坚持使用标准操作。好的。什么是正确的方法?

同样,像this guy这样的一些消息来源建议在 nouns 中考虑我的场景,似乎我需要一个“搜索”控制器......它只是没有说服我,我必须创建一个完整的类,而我通常做def search只是为了保持它ResTful。

我出错了什么?这里的常见解决方案是什么?

感谢。

3 个答案:

答案 0 :(得分:5)

REST是一个概念,而不是宗教:-)。但核心动词是GET / POST / PUT / DELETE,它们映射到相关的HTTP动词。 URL中的内容通常是对此的反映,并且(这更像是Rails哲学)遵循约定可以使一切变得更加容易。您使用通用rails(例如脚手架)获得的URL在几个方面并不是特别理想,但它们有效,您可以更改它们。

所以,是的,对于搜索(假设它开始很简单,例如在单个模型中查找记录,比如Product),那么你可以使用像这样的查询字符串进行GET

def search
  @results = Product.where("name ILIKE ?", params[:query])
  ...
end

这会导致像/product/search?query="foo"这样的网址 - 没错。

答案 1 :(得分:4)

这取决于您的搜索是针对一个资源还是多个资源。例如,如果您有ProductsController并且只想为您的产品实现搜索功能,则可以创建一个名为“search”的集合操作(​​url将是/ products / search)

如果你的搜索是针对很多资源的,我会创建一个带有单例资源的SearchesController:在我的路径文件中搜索。

然后,当您在应用程序中实现搜索功能时,不要将所有逻辑放在控制器中,而是创建模型类来处理搜索。您甚至可以创建一个抽象类来映射到您的搜索表单,从而避免使用'* _tag'字段来创建您的搜索表单。

请参阅:https://github.com/slainer68/basic_active_model

答案 2 :(得分:3)

如果你想坚持REST(这是一个真正的指南,它有利有弊),那么你链接到的幻灯片是推荐正确的做事方式。

因此,例如,如果您有一个comments_controller,并且希望能够搜索注释,则可以创建一个comments_search_controller。搜索表单位于comments_search_controller #new,它将POST到comments_search_controller #create。

是的,你正在以这种方式创建另一个类,但这与在comments_controller中创建另一个动作并没有太大的不同,它确实保持一致和分离。你不需要一个新的CommentSearch模型或任何东西,只需要那个控制器,它会向你的评论模型询问相关的搜索结果。