所以,我对Rails很陌生,并且仍在努力完成这些原则。我想和大多数人一样,我已经开始创建那个基本的CRUD了。好的。完成。
现在我想要一个新动作:搜索。事实证明,它不是7个休息神圣(!)动作之一(如果做对了)。虽然我知道我可以实现新的自定义操作并为其提供资源,但我会在一些地方阅读,尽可能地坚持使用标准操作。好的。什么是正确的方法?
同样,像this guy这样的一些消息来源建议在 nouns 中考虑我的场景,似乎我需要一个“搜索”控制器......它只是没有说服我,我必须创建一个完整的类,而我通常做def search
只是为了保持它ResTful。
我出错了什么?这里的常见解决方案是什么?
感谢。
答案 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'字段来创建您的搜索表单。
答案 2 :(得分:3)
如果你想坚持REST(这是一个真正的指南,它有利有弊),那么你链接到的幻灯片是推荐正确的做事方式。
因此,例如,如果您有一个comments_controller,并且希望能够搜索注释,则可以创建一个comments_search_controller。搜索表单位于comments_search_controller #new,它将POST到comments_search_controller #create。
是的,你正在以这种方式创建另一个类,但这与在comments_controller中创建另一个动作并没有太大的不同,它确实保持一致和分离。你不需要一个新的CommentSearch模型或任何东西,只需要那个控制器,它会向你的评论模型询问相关的搜索结果。