Rails 4 Unpermited参数嵌套属性curl测试

时间:2013-12-09 15:48:11

标签: ruby-on-rails curl

使用rails 4.0.2 我在使用curl创建一个针对新博客Post的嵌套注释数组时遇到问题。我可以使用curl创建一个新的博客帖子,但我在日志中得到“未经许可的参数:评论”,当我尝试创建链接到新帖子的评论时,没有创建评论。

我已将posts_nested_attributes_for添加到Post模型,并更新了post控制器中的post_params方法以接受comments_attributes。

我想对应用程序运行curl并在同一个调用中创建一个新帖子和评论。我的curl调用中是否存在问题,或者我在嵌套属性设置中遗漏了什么?任何建议表示赞赏。

这会创建一个新的帖子但不是评论:

curl -i -X POST -d 'post[title]=curlTest6 &post[comments][comment][commenter]=TestComment' http://localhost:3000/posts

记录上述电话:

Processing by PostsController#create as */*
  Parameters: {"post"=>{"title"=>"curlTest6 ", "comments"=>{"comment"=>{"commenter"=>"TestComment"}}}}
Unpermitted parameters: comments
   (0.1ms)  begin transaction
  SQL (1.2ms)  INSERT INTO "posts" ("created_at", "title", "updated_at") VALUES (?, ?, ?)  [["created_at", Mon, 09 Dec 2013 15:27:18 UTC +00:00], ["title", "curlTest6 "], ["updated_at", Mon, 09 Dec 2013 15:27:18 UTC +00:00]]
   (1.0ms)  commit transaction

评论模型

class Comment < ActiveRecord::Base
  belongs_to :post
end

发布模型

class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  accepts_nested_attributes_for :comments, :allow_destroy => true



  validates :title, presence: true,
                      length: { minimum: 5 }

end

帖子控制器

class PostsController < ApplicationController
  skip_before_filter :verify_authenticity_token, :only => [:create]

  def new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
        redirect_to @post
      else
        render 'new'
    end
  end


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

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @post = Post.find(params[:id])

    if @post.update(params[:post].permit(:title, :text))
      redirect_to @post
    else
      render 'edit'
    end
  end

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    redirect_to posts_path
  end


  def index
    @posts = Post.all
  end

  private
  def post_params
     params.require(:post).permit(:title, :text, comments_attributes:[:commenter, :body])
   end

end

评论控制器

class CommentsController < ApplicationController

  def create
      @post = Post.find(params[:post_id])
      @comment = @post.comments.create(params[:comment].permit(:commenter, :body))
      redirect_to post_path(@post)
    end

    def destroy
       @post = Post.find(params[:post_id])
       @comment = @post.comments.find(params[:id])
       @comment.destroy
       redirect_to post_path(@post)
     end 
end

2 个答案:

答案 0 :(得分:2)

首先,您的Comments控制器不会在此处使用,只会使用create控制器的Posts方法。控制器用于操作,不一定是资源。

对于这些参数:

{"post"=>{"title"=>"curlTest6 ", "comments"=>{"comment"=>{"commenter"=>"TestComment"}}}}

你强烈谴责他们:

params.require(:post).permit(:title, {comments: [ { comment: [ :commenter ] } ]}) 

另请注意,对于accepts_nested_attributes_for,通常您希望参数为:comments_attributes而不是comments,然后没有其他名称空间(因此没有comment。阅读详情关于这个here

params.require(:post).permit(:title, {comments_attributes: [ :commenter ]})

卷曲请求将是:

$ curl -i -X POST -d 'post[title]=curlTest6 &post[comments_attributes][][commenter]=TestComment' http://localhost:3000/posts

答案 1 :(得分:0)

这是因为您需要能够更新帖子以添加其他评论吗?也许控制器的update方法中的这一行是问题所在:

if @post.update(params[:post].permit(:title, :text))

将其改为此是否合理:

if @post.update(post_params)