用Rails方式隐藏未发布的内容

问题描述

我对以前在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找不到任何东西,它将引发异常,它默认为您想要的行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...