这不是一个真正的疑难解答问题,而是一个解释请求。我很难理解form_for方法的工作原理。有人可以向我解释这种方法在这种情况下的作用。这是我在博客应用程序上为评论功能创建表单的代码。我的代码有效,所以我只想了解它的工作原理和工作原理。谢谢!!
这是我的新评论表:
<%= form_for([@post, @post.comments.build]) do |c| %>
<p>
<%= c.label :content, class: "col-md control-label" %><br>
<%= c.text_area :content, rows: "10", class: "form-control" %>
</p>
<p>
<%= c.submit %>
</p>
<% end %>
这是我的评论代码控制器:
class CommentsController < ApplicationController
def new
@post = Post.find(params[:post_id])
end
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(comment_params)
@comment.user_id = current_user.id
@comment.save
#redirect_to post_path(@post)
redirect_to posts_path
end
private
def comment_params
params.require(:comment).permit(:content)
end
end
特别是,form_for的“[@ post,@ post.comments.build]”参数是做什么的?
答案 0 :(得分:8)
首先,使用form_for
无法对form_tag
执行任何操作(以及一些额外输入)。
form_for
允许您执行的操作是根据网址和广告素材轻松创建符合铁路惯例的表单。参数命名。
form_for
的第一个参数是正在编辑或创建的资源。最简单的可能只是@post
。数组表单用于命名空间或嵌套资源。
您的[@post, @post.comments.build]
示例意味着这是一个新注释的表单(数组的最后一个元素是未保存的Comment实例),它嵌套在该特定帖子下。这将导致表单向/posts/1234/comments
发出POST请求(假设帖子的id为1234)。需要存在相应的嵌套路由才能使其生效。
form_for
为您做的第二件事是允许您编写c.text_area :content
并让它自动使用正确的参数名称(注释[内容])并使用预先填充的当前值的值评论的content
属性。
答案 1 :(得分:2)
form_for将对特定资源执行发布并帮助绘制输入。
示例1
form_for(@post)
将发布到myapp/posts/create
并绘制帖子字段
示例2
form_for([@post, @post.comments.build])
将发布到myapp/posts/:post_id/comments/create
并绘制评论字段
答案 2 :(得分:0)
此处[@ post,@ post.comments.build]表示此表单用于新注释,表单将对/ posts / post_id / comments执行POST请求(post_id是@ post.id)