在模型validation失败的Rails中哪里呈现注释控制器?

我的rails应用程序中有一个简单的video模型,有很多评论。 我在video的节目页面上显示这些评论。 当我提交表格时,一切正常; 但是,如果评论模型上存在validation错误,那么我的系统会崩溃。 如果评论模型上存在validation错误,我只想再次渲染video的显示页面,并显示validation错误样式。 如何在我的创建操作中执行此操作? 非常感谢!

 class CommentsController  'Thanks for posting your comments.' else render # what? What do I render in order to show the video page's show action with the validation error styling showing? Please help! end end end 

要做到这一点,你必须渲染一个模板:

 class CommentsController < ApplicationController def create @video = Video.find(params[:video_id]) @comment = @video.comments.build(params[:comment]) if @comment.save redirect_to @video, :notice => 'Thanks for posting your comments.' else render :template => 'videos/show' end end end 

请记住,您还必须在CommentsController #create操作中声明任何实例变量(如@video),因为不会运行VideosController #show action,只会呈现模板。 例如,如果您在VideosController#show action中有@video_name变量,则必须将相同的@video_name实例变量添加到CommentsController #create操作中。

我也有同样的问题。 我认为你的问题是重定向的Railsvalidation的复制(并且最近还通过自定义validation错误从其他父控制器rails 3.1中的控制器复制)。

Pan Thomakos上述解决方案的问题在于,如果VideosController#show包含的内容不仅仅是非常重要的代码,那么在不违反DRY规则的情况下,您将无法从videos/show模板中呈现。 这是一个相关的讨论 。

来自 Railscasts成名的Ryan Bates的这篇文章表明你可以将@video存储在flash中,以便在重定向中保留它; 然而,当我尝试这样做时,它作为正确类的一个实例出现在另一侧,但它没有你期望的任何超类 – 最重要的是ActiveRecord::Base 。 起初我想也许他的建议已经过时了(它是在2006年写的)。 但是,2009年10月编写的Railsvalidation重定向的答案之一提出了相同的方法,尽管通过自定义clone_with_errors方法获取模型实例的浅层副本以避免更深层对象的问题。 但即使采用这种方法,依赖于超类的任何方法都不起作用。 我猜这是将对象序列化到flash中然后从中反序列化的结果。

我在2007年发现了一个页面,它主张不在会话中存储模型对象实例 。

我还在formtastic google小组中找到了一个很好的论据,指出重定向validation失败不是Rails方式 ,可能是一个坏主意。 但是,在涉及多个控制器的情况下,这仍然不能提供良好的解决方案。 也许Cell可以用来解决上面提到的DRY问题。

否则我猜唯一的答案是坚持使用持久化的简单数据,如对象ID,错误消息字符串等。