Rails 隐藏未发布内容的方法

Rails way of hiding things that are unpublished

我对以前在 Node 或 Django 中做过无数次的事情有点困惑。

我正在构建一个仅 API 的 Rails 应用程序。

假设我有一个包含博客 post 的 Post 模型。该模型有一个 published 属性,它确定某个 post 是否已经可用于较大的 public。

显然,如果标志为真,控制器的目标是 return post(s) 的 JSON。

对于集合,我在 Post 模型中创建了一个简单的范围,如下所示:

  scope :published, -> { where(published: true) }

但是,对于单个请求,我不确定什么是正确的,或者更确切地说:Rails 处理此问题的方式。我可以“强迫它”,但我觉得像这样的事情有一个巧妙的“约定优于配置”技巧。

本质上,我很好奇最干净的解决方案:如果 post 的已发布属性为真,return post 对象, 如果为假, return a 404

我应该看看示波器吗?序列化程序?宝藏藏在哪里?

感谢贡献!

没有金弹,但使用范围很好

在你的控制器中你可能有类似的东西:

post = Post.find(params[:post_id])

现在,使用您的 published 范围将按预期工作(它在 SQL AND 中的类型 of/results):

post = Post.published.find params[:post_id]

不会首先从数据库中查询所有已发布的帖子,然后再浏览它们。此处特定 ORM(执行代码对象 <-> 数据库映射)的美妙之处在于,您最终将对数据库进行一次查询(如日志文件中所示)。

返回 404 或其他任何东西仍然取决于 you/your 控制器业务 - 因为 find 如果没有发现任何内容将引发异常,它默认为您希望的行为。