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

age*_*217 9 controller ruby-on-rails render

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

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 # 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
Run Code Online (Sandbox Code Playgroud)

Pan*_*kos 10

为此,您必须呈现模板:

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
Run Code Online (Sandbox Code Playgroud)

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


Ada*_*ers 8

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

Pan Thomakos上述解决方案的问题在于,如果其中VideosController#show包含的代码数量超过了非常重要的数量,那么在videos/show不违反DRY规则的情况下,您将无法从模板进行渲染.这是一个相关的讨论.

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

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

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

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