ruby on rails has_many 关系表单验证孩子

Posted

技术标签:

【中文标题】ruby on rails has_many 关系表单验证孩子【英文标题】:ruby on rails has_many relation form validation of children 【发布时间】:2011-07-20 19:13:50 【问题描述】:

我按照教程创建了博客应用程序。所以我有帖子和cmets。帖子表单中的字段验证非常完美。帖子的 cmets 部分中的验证也有效,但我无法打印错误。

评论模型:

班级评论 属于_to :post 验证 :commenter, :presence => true 结尾

评论控制器:

定义创建 @post = Post.find(params[:post_id]) @comment = @post.cmets.build(params[:comment]) 如果@comment.save 重定向到 post_path(@post) 别的 渲染:模板 => '帖子/显示' 结尾 结尾 定义破坏 @post = Post.find(params[:post_id]) @comment = @post.cmets.find(params[:id]) @comment.destroy 渲染:模板 => '帖子/显示' 结尾

后控制器:

定义索引 @posts = Post.all respond_to 做 |格式| format.html # index.html.erb format.xml 渲染 :xml => @posts 结尾 结尾 定义显示 @post = Post.find(params[:id]) @comment = @post.cmets.build #add #@comment = @Comment.new #添加 respond_to 做 |格式| format.html # show.html.erb format.xml 渲染 :xml => @post 结尾 结尾 定义新 @post = Post.new respond_to 做 |格式| format.html # new.html.erb format.xml 渲染 :xml => @post 结尾 结尾 定义编辑 @post = Post.find(params[:id]) 结尾 定义创建 @post = Post.new(params[:post]) respond_to 做 |格式| 如果@post.save format.html redirect_to(@post, :notice => '帖子创建成功。') format.xml 渲染 :xml => @post, :status => :created, :location => @post 别的 format.html 渲染 :action => "new" format.xml 渲染 :xml => @post.errors, :status => :unprocessable_entity 结尾 结尾 结尾 定义更新 @post = Post.find(params[:id]) respond_to 做 |格式| 如果@post.update_attributes(params[:post]) format.html redirect_to(@post, :notice => '帖子已成功更新。') format.xml 头:ok 别的 format.html 渲染 :action => "编辑" format.xml 渲染 :xml => @post.errors, :status => :unprocessable_entity 结尾 结尾 结尾 定义破坏 @post = Post.find(params[:id]) @post.destroy respond_to 做 |格式| format.html redirect_to(posts_url) format.xml 头:ok 结尾 结尾

我使用的形式是:

<%= form_for([@post, @post.comments.build]) do |f| %>

如何获取 cmets 的 .errors?如果我尝试,我总是得到:未定义的方法“错误”或 nil 对象。

请帮忙,我对 Rails 完全陌生。

谢谢!

皮卡

【问题讨论】:

你用的是什么版本的rails? 【参考方案1】:

问题是,每次加载表单时,您都在构建新的评论。像这样,带有验证错误的评论永远不会进入您的表单。

改为在您的控制器中创建评论,如下所示 - 详细信息取决于您的应用程序:

# posts controller
def show
  @post = Post.find(params[:id])
  @comment = Comment.new
end

# comments controller
def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.build(params[:comment])
  if @comment.save
    redirect_to @post
  else
    render :new
  end
end

并改变你的形式:

<%= form_for([@post, @comment]) do |f| %>

【讨论】:

您好!现在我可以得到comment.errors。完美运行。谢谢极地布劳!! 但是现在我有一个新问题。当我创建一个新帖子时,我总是附有一个空评论,如果我想销毁它,我会得到“没有路线匹配”。你能帮我解决这个问题吗?谢谢!问候,皮奇 嗨,Comment.new 导致“nil:NilClass 的未定义方法‘新’”,因为我只有“_comment.html.erb _form.html.erb”。 如果没有控制器和查看代码,很难猜到。你能再展示一些吗? 将控制器代码添加到我的初始帖子中。你需要看更多吗?再次感谢你的帮助。问候,picki

以上是关于ruby on rails has_many 关系表单验证孩子的主要内容,如果未能解决你的问题,请参考以下文章

Ruby-on-Rails:多个 has_many :通过可能吗?

ruby on rails(model)

如何在 Ruby on Rails 中通过关联订购 has_many?

ruby-on-rails - 嵌套资源问题

Ruby on Rails:用户模型关联应用程序和迁移

在 Ruby on Rails 4.2 中使用 Cocoon gem 嵌套表单