请在Rails中解释form_for方法

Nda*_*ior 3 ruby model-view-controller ruby-on-rails form-for

这不是一个真正的故障排除问题,而是一个解释请求.我很难理解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 %> 
Run Code Online (Sandbox Code Playgroud)

这是我的评论代码控制器:

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

特别是,form_for的"[@ post,@ post.comments.build]"参数是做什么的?

Fre*_*ung 8

首先,没有什么可以做form_for你不能做的form_tag(和一些额外的打字).

是什么form_for让你做的是轻松创建与轨道公约适应的URL和参数命名的项形式.

第一个参数form_for是正在编辑或创建的资源.最简单的可能就是这样@post.数组表单用于命名空间或嵌套资源.

您的示例[@post, @post.comments.build]意味着这是一个新注释的表单(数组的最后一个元素是未保存的Comment实例),它嵌套在该特定帖子下.这将导致表单执行POST请求/posts/1234/comments(假设帖子的id为1234).需要存在相应的嵌套路由才能使其生效.

第二件事form_for是允许你编写c.text_area :content并让它自动使用正确的参数名称(注释[content])并使用预先填充注释content属性的当前值.