我在我的代码中使用了一个可怕的模式,我知道必须有更好的方法来做到这一点。帮助我重新思考我在做什么。
我的网站是一种讨论论坛。所有对讨论的回复都在 DiscussionsController#show 页面上进行,内联。
但是,有些回复是无效的 - 例如,如果您尝试发布没有文本的回复,它会将您返回到 DiscussionsController#show 并显示错误消息。
以下是我如何实现此工作流程的简要概述:
- 用户转到 DiscussionsController#show。这个模板上有一个回复表格。没有明确的 RepliesController#new 操作。
- 用户提交回复表单,该表单被 POST 到 replies_path 并在 RepliesController#create 中处理。
- RepliesController#create 无法保存回复,因为它无效(回复中的 validates_length_of 使对象无效)。
- RepliesController#create 将回复对象放入 session[:new_reply] 并重定向到用户来自的讨论路径。
- DiscussionsController#show 处理会话对象...
像这样:
if session[:new_reply]
@new_reply = session[:new_reply]
session.delete(:new_reply)
end
现在 show.html.erb 有一个新生成的 @new_reply 对象来检查错误。
这显然有问题 - 您不应该将整个对象存储在会话中。但是由于我们试图保存在 RepliesController#create 中的回复对象从未保存,我如何在控制器操作调用之间保存它?
或者,如果有更大的设计解决方案,请随时分享。这太丑了,它伤害了我。谢谢。