如何从PostRevisor模块中引发错误并将其呈现给用户?

这里有一段代码,我想添加一些额外的验证

(简化的代码和用例)

# 防止非管理员更改主题的类别
  PostRevisor.track_topic_field(:category_id) do |tc, category_id|
    if tc.guardian.is_staff?
      tc.record_change('category_id', tc.topic.category_id, category_id)
      tc.topic.category_id = category_id
    else
       tc.topic.errors[:base] << "您不能更改此类型主题的类别"
    end
  end

这将阻止非管理员更改类别,但不会向上冒泡错误。

这曾经有效:

但该插件后来已被存档。

这个需求应该得到 API 的支持吧?

你在这方面比我擅长,但我认为 Rails 不需要将此反馈上去,因为人们预期 Ember 不会让用户选择一个用户不应选择的类别。所以也许可以确保前端阻止他们更改类别,如果他们不应该这样做的话,这样 PostRevisor 就永远不会面临这种不舒服的情况?

1 个赞

是的,当然,这是一个考虑因素。

首先在 API 端限制,然后如果可以的话在前段限制,这是个好习惯——也就是说,你不应该只依赖前端来阻止非法操作。

此外,前端 应该 冒泡 Active Record 错误。

因此,在 API 中执行此操作很重要。

同意。您希望 Rails 强制执行它。

我以为我明白它正在强制执行要求并且拒绝进行更改,但只是没有向前端提供足够好的错误。

1 个赞

是的,你说得对。

我只是想阻止类别更改,所以用户界面有点无用,因为它被设计成允许你更改所有元数据,或者根本不更改。

因此,一个冒泡的错误将非常有用。

.gjs 模板的僵化使得这类更改现在非常棘手。

这个模板仍然是 hbs,但出于显而易见的原因,我不想覆盖它。

我将尝试一个 CSS 技巧。

同样,你在这方面比我强,但我认为隐藏类别选择器是可能的看起来行不通。

所以也许应该做的是修改类别序列化器,使其不发送任何类别。不过,这似乎很棘手,因为你需要弄清楚如何在编辑主题时修改它,而不是在创建主题时修改。

1 个赞

“Hack”成功了 :tada: :

我仍然希望服务器能给出一个详细且合理的响应,特别是能利用Active Record的响应。

我也遇到了这种行为,而且不知所措。我所有的开发和测试都通过 API 请求进行,因为我还没有前端,所以当收到的响应看起来像成功时,我感到很困惑。我以为我的守卫根本不起作用,直到我拼凑了一个最小的调试器并艰难地通过了步进器。

编辑:
嗯……决定给我的环境进行一次彻底的重启,它就开始在 API 响应中返回错误消息了。