首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails-3,来自多态关联的新注释表单,接受表单提交,但不显示提交的数据

rails-3,来自多态关联的新注释表单,接受表单提交,但不显示提交的数据
EN

Stack Overflow用户
提问于 2011-02-16 07:51:12
回答 1查看 965关注 0票数 1

我有一个多态的评论模型,在posts_controller的show.html.erb上,我有一个链接‘添加评论’,在那里你可以点击评论帖子。当你点击链接时,“新的评论表单”就会出现,但是当你提交表单时,评论不会显示在app.Here中的任何地方。这是带有一些视图文件和控制器的要点:https://gist.github.com/828400,这是模型,schema.rb和日志文件:https://gist.github.com/828447,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-18 20:04:49

如果查看app/views/comments/_form.html.erb,您会注意到它使用以下命令构建表单

代码语言:javascript
复制
[@post, Comment.new]

这意味着当@ PostsController 设置正确时,当您直接从post视图创建评论时,它可以正常工作。这意味着表单构建器将表单的操作设置为/posts/5/comments (其中5取自@post.id),从而设置CommentsController在CommentsController#get_parent中查找的post_id参数。

但是,当您单击“添加注释”或“添加回复”时,您处于CommentsController中,它设置了一个名为@parent的变量。这意味着表单构建器将表单的操作设置为/comments (因为@post为空),这意味着当您提交表单时,post_id和comment_id参数都为空。

这意味着它在CommentsController#get_parent中达到了下面这一行:

代码语言:javascript
复制
redirect_to root_path unless defined?(@parent)

这意味着您的表单内容将被静默丢弃。

要使表单正常工作,最简单的方法是进行以下更改:

代码语言:javascript
复制
#app/controllers/posts_controller.rb:

def show
-    @post = Post.find(params[:id])
+    @parent = @post = Post.find(params[:id])
end

#app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb

-  
+  

正如您将看到的,这意味着表单查找@parent对象(而不是@post),然后由PostsController & CommentsController设置该对象。

顺便说一下,您可以考虑进行以下更改以加强您的代码:

代码语言:javascript
复制
-  redirect_to root_path unless defined?(@parent)
+  redirect_to root_path unless @parent

如果没有定义@parent,它将返回nil,这被认为是false。

代码语言:javascript
复制
-  return @post if defined?(@post)
-  @post = commentable.is_a?(Post) ? commentable : commentable.post
+  @post ||= commentable.is_a?(Post) ? commentable : commentable.post

此外,还可以在视图中调用Comment.new。通常,初始化对象应该在控制器中完成,视图应该限制在表示逻辑中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5010900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档