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