请在Rails中解释form_for方法

时间:2015-03-17 13:35:42

标签: ruby-on-rails ruby model-view-controller 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 %> 

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

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]”参数是做什么的?

3 个答案:

答案 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)