我在代码中使用了一个丑陋模式,我知道一定有更好的方法来做到这一点。帮助我重新思考我在做什么。
我的网站是一种论坛。对讨论的所有回复均在 DiscussionsController#show 页面上内嵌完成。
不过,有些回复是无效的 - 例如,如果您尝试发布不含文本的回复,它会返回 DiscussionsController#show 并显示一条错误消息。
以下是我如何实现此工作流程的简要概述:
- 用户转到 DiscussionsController#show。该模板上有一个回复表格。没有明确的 RepliesController#new 操作。
- 用户提交回复表单,该表单被发布到replies_path并在RepliesController#create中处理。
- RepliesController#create 无法保存回复,因为它无效(回复中的 validates_length_of 会使对象无效)。
- RepliesController#create 将回复对象放入 session[:new_reply] 中并重定向到用户来自的discussion_path。
- DiscussionsController#show 处理 session 对象...
像这样:
if session[:new_reply]
@new_reply = session[:new_reply]
session.delete(:new_reply)
end
现在 show.html.erb 有一个新生成的 @new_reply 对象来检查错误。
这显然有问题 - 您不应该将整个对象存储在 session 中。但是,由于我们尝试在 RepliesController#create 中保存的 Reply 对象从未保存过,因此如何在 Controller 操作调用之间保留它?
或者如果有更大的设计解决方案,请随时分享。这太丑了,让我很痛苦。谢谢。
最佳答案
不做重定向,而是做 render :action => "discussions/show"
怎么样?我想说的是,您还必须设置 @discussion
变量,但这应该完成,因为回复是讨论中的嵌套资源,对吗?
关于ruby-on-rails - 使用 RESTful session 在 Controller 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842963/