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 :通过可能吗?