我希望在我的帖子scaffold中实现预览功能。我需要做的就是允许用户在新视图中输入信息(/ posts / new),然后用预览按钮替换提交按钮。
单击预览按钮后,用户将被路由到预览页面(可能是/ posts / new / preview)。如果用户想要进行更改,他们会点击“返回”,或者如果他们对帖子感到满意,他们就可以提交帖子。
我发现了这篇文章(http://eyedeal.team88.org/node/105),但似乎过时了。关于最佳方法的任何想法都是什么?
非常感谢, 贝
答案 0 :(得分:3)
在创建页面上提交时,在新操作中,构建对象但不将其保存到数据库中。然后在其显示视图中渲染对象,并在新操作中设置标记以显示提交按钮。在show视图中,始终有一个表单,其中包含要在隐藏输入字段或display:none中保存到db的对象的所有属性。设置标志后,显示提交按钮。在提交时,您转到new_to_db操作,该操作将对象保存到数据库。
答案 1 :(得分:0)
你发布的链接是一种方式,但我更喜欢保存对象并设置一个布尔标志,让我们说public为false(:default => false在迁移中定义)。 然后你基本上做的是实际创建帖子并重定向到显示动作,你在哪里 编辑按钮(渲染编辑动作), 发布按钮(将公共标志设置为true的自定义操作) 和取消按钮(实际删除帖子) 并且可能会继续以后按钮,这会保留帖子并重定向到任何其他页面,因此用户可以稍后返回并完成编辑。
当您需要显示所有帖子时,请定义named_scope:visible,:conditions => ['posts.public =?',true]并在索引和类似操作中调用Post.visible而不是Post.all。您还可以使用条件['posts.public =?',false]定义default_scope,但请记住,如果要查找不可见的帖子,则必须使用#without_scope。
这种方式比链接中的方式更好,因为用户总是可以稍后返回并完成对帖子的编辑并将其发布。但是,您将在DB中存储更多对象,并且必须处理不可见的帖子(默认情况下不显示它们等)。