问题描述
我对以前在Node或Django中做过无数次的工作感到有些困惑。
我正在构建仅API的Rails应用。
说我有一个Post
模型,其中包含博客文章。该模型具有published
属性,该属性确定某个帖子是否已经可供较大的公众使用。
很明显,如果标志为true,则控制器中的目标是返回帖子的JSON。
对于集合,我在Post模型中创建了一个简单的作用域,如下所示:
scope :published,-> { where(published: true) }
但是,对于单个请求,我不确定什么是正确的,或者更确切地说是:Rails处理此问题的方式。我可以“强制执行”,但是我感觉像这样的事情有一个巧妙的“约定之上的配置”技巧。
本质上,我对最干净的解决方案感到好奇:如果发布的发布属性为true,则返回发布对象,如果为false,则返回404
我应该看看范围吗?序列化器?宝藏在哪里?
感谢您的贡献!
解决方法
没有金色的子弹,但可以使用范围。
在您的控制器中,您可能有类似的内容:
post = Post.find(params[:post_id])
现在,使用您的published
范围将按预期运行(其类型/结果是SQL AND
):
post = Post.published.find params[:post_id]
它将不首先从数据库中查询所有已发布的帖子,然后对其进行浏览。特定的ORM(执行代码对象数据库映射)的好处在于,您将只对数据库进行单个查询(如在日志文件中看到的那样)。
退回404或其他仍由您/您的控制器公司决定的东西-如果find
找不到任何东西,它将引发异常,它默认为您想要的行为。