Rails - 为什么我的帖子表单与评论表单不同?

时间:2016-01-07 23:37:17

标签: ruby-on-rails ruby forms ruby-on-rails-4

posts_controller.rb:

 def create
    @post = current_user.posts.build(post_params)
    if @post.save
      flash[:success] = "Post created!"
      redirect_to root_url
    else
      render 'pages/home'
    end
      end

   private

    def post_params
      params.require(:post).permit(:content)
    end

发表表格:

<%= form_for(@post) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new post..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

comments_controller.rb:

def create
    @post = Post.find(params[:comment][:post_id])
    @comment = @post.comments.build(comment_params)
    @comment.user = current_user
    if @comment.save
      flash[:success] = "Comment created!"
      redirect_to post_path(@post)
    else
            flash[:danger] = "Comment failed, try again."
            redirect_to post_path(@post)
        end
      end

  private

    def comment_params
      params.require(:comment).permit(:content)
    end

评论表:

<%= form_for(@comment) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Comment..." %>
  </div>
  <%= f.hidden_field :post_id , value: @post.id %>   // WHY DO I NEED THIS?
  <%= f.hidden_field :user_id , value: current_user.id %>  // AND THIS?
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

为什么我需要这些隐藏字段才能使评论工作时不需要评论?我的代码正在运行,我能够谷歌一个解决方案,但仍然感兴趣为什么确切的评论工作不同于帖子。对不起,这是一个愚蠢的问题,但作为初学者,我正在寻找类比:)

2 个答案:

答案 0 :(得分:0)

这里的基本想法是,当您提交该评论时,它会将这些ID以及其他参数发布到您的评论创建操作中。这样您就可以使用这些ID来查找模型对象。

但在您的情况下,您不需要用户ID,因为它已经在current_user帮助器中可用。

答案 1 :(得分:0)

首先,您不需要current_user.id。当前用户通过视图和控制器是一致的,并且可能会导致安全威胁将其置于表单中。 (有趣的用户可以代表其他用户发表评论)

其次,您需要将post_id添加为隐藏的评论文件,因为post_params基本上是标题/正文等,所有用户提交的值。但是,注释需要一个应用程序定义的值,即post_id。请查看https://github.com/nathanvda/cocoon/wiki/A-guide-to-doing-nested-model-forms以使用有助于实现一对多关联的嵌套表单。

您需要的是通过posts_controller中的更新操作创建注释。这样您就可以保持相同的模式,并使代码保持干净。

本教程应该对您有所帮助: http://www.sitepoint.com/complex-rails-forms-with-nested-attributes/