这里有一段代码,我想添加一些额外的验证
(简化的代码和用例)
# 防止非管理员更改主题的类别
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
这将阻止非管理员更改类别,但不会向上冒泡错误。
这曾经有效:
unless tc.guardian.is_staff?
staff_tags = ::DiscourseTagging.staff_only_tags(new_tags)
if staff_tags.present?
tc.topic.errors[:base] << I18n.t("tags.staff_tag_disallowed", tag: staff_tags.join(" "))
tc.check_result(false)
next
end
staff_tags = ::DiscourseTagging.staff_only_tags(removed_tags)
if staff_tags.present?
tc.topic.errors[:base] << I18n.t("tags.staff_tag_remove_disallowed", tag: staff_tags.join(" "))
tc.check_result(false)
next
end
end
tc.record_change(TAGS_FIELD_NAME, tc.topic.custom_fields[TAGS_FIELD_NAME], tags)
tc.topic.custom_fields.update(TAGS_FIELD_NAME => tags)
::DiscourseTagging.auto_notify_for(new_tags, tc.topic) if new_tags.present?
end
但该插件后来已被存档。
这个需求应该得到 API 的支持吧?
pfaffman
(Jay Pfaffman)
2025 年1 月 14 日 14:56
2
Robert:
这个需求应该得到 API 的支持吧?
你在这方面比我擅长,但我认为 Rails 不需要将此反馈上去,因为人们预期 Ember 不会让用户选择一个用户不应选择的类别。所以也许可以确保前端阻止他们更改类别,如果他们不应该这样做的话,这样 PostRevisor 就永远不会面临这种不舒服的情况?
1 个赞
Jay Pfaffman:
所以也许确保前端阻止他们更改类别
是的,当然,这是一个考虑因素。
首先在 API 端限制,然后如果可以的话在前段限制,这是个好习惯——也就是说,你不应该只依赖前端来阻止非法操作。
此外,前端 应该 冒泡 Active Record 错误。
因此,在 API 中执行此操作很重要。
pfaffman
(Jay Pfaffman)
2025 年1 月 14 日 15:26
4
Robert:
因此,在 API 中执行此操作很重要。
同意。您希望 Rails 强制执行 它。
我以为我明白它正在强制执行要求并且拒绝进行更改,但只是没有向前端提供足够好的错误。
1 个赞
是的,你说得对。
我只是想阻止类别更改,所以用户界面有点无用,因为它被设计成允许你更改所有元数据,或者根本不更改。
因此,一个冒泡的错误将非常有用。
.gjs 模板的僵化使得这类更改现在非常棘手。
这个模板仍然是 hbs,但出于显而易见的原因,我不想覆盖它。
我将尝试一个 CSS 技巧。
pfaffman
(Jay Pfaffman)
2025 年1 月 14 日 20:00
6
Robert:
我将尝试一种 CSS 技巧。
同样,你在这方面比我强,但我认为隐藏类别选择器是可能的 看起来行不通。
所以也许应该做的是修改类别序列化器,使其不发送任何类别。不过,这似乎很棘手,因为你需要弄清楚如何在编辑主题时修改它,而不是在创建主题时修改。
1 个赞
“Hack”成功了 :
我仍然希望服务器能给出一个详细且合理的响应,特别是能利用Active Record的响应。
Alteras
(Steven Chang)
2025 年3 月 5 日 16:48
8
我也遇到了这种行为,而且不知所措。我所有的开发和测试都通过 API 请求进行,因为我还没有前端,所以当收到的响应看起来像成功时,我感到很困惑。我以为我的守卫根本不起作用,直到我拼凑了一个最小的调试器并艰难地通过了步进器。
编辑:
嗯……决定给我的环境进行一次彻底的重启,它就开始在 API 响应中返回错误消息了。