这是我在CommentsController中的当前Create方法
def create
@place = Place.find(params[:place_id])
@comment = @place.comments.create(comment_params)
@comment.user = current_user
if @comment.save
redirect_to place_path(@place)
else
render "comments/_form"
end
end
某人告诉我,这次数据库击中了两次。检查日志后,结果如下:
Started GET "/places/9" for 127.0.0.1 at 2015-01-22 15:01:47 -0800
Processing by PlacesController#show as HTML
Parameters: {"id"=>"9"}
Place Load (0.3ms) SELECT "places".* FROM "places" WHERE "places"."id" = ? LIMIT 1 [["id", 9]]
Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."place_id" = ? [["place_id", 9]]
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
Rendered comments/_comment.html.erb (8.0ms)
Rendered comments/_form.html.erb (2.7ms)
Rendered places/show.html.erb within layouts/application (73.3ms)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
Completed 200 OK in 532ms (Views: 529.4ms | ActiveRecord: 1.0ms)
很明显,我不想在我的代码中效率低下。
这是该人的建议:
comment_params[:user_id] = current_user.id
if @places.comments.create(comment_params)
.....
else
....
end
所以......我重写了Create方法:
def create
@place = Place.find(params[:place_id])
@comment = @place.comments.create(comment_params)
comment_params[:user_id] = current_user.id
if @places.comments.create(comment_params)
redirect_to place_path(@place)
else
render "comments/_form"
end
end
在重写Create方法后,当我尝试发表评论时,我不断收到此错误:undefined method comments for nil:NilClass
请帮我理解如何正确地重写这个Create方法,好吗?
SideNote - 如果是,请不确定是否相关,请解决,如果不是,请忽略
在检查rails控制台中的最后一条评论后,我惊讶地发现user_id是 nil ,而对于地方,则不是。
地方属于用户 评论属于User
用户有很多地方和评论
答案 0 :(得分:0)
您正在调用create
两次,这会导致评论被发布两次,这可能不是您想要的。
第一次调用create时,它没有分配user_id,这就是数据库中user_id
设置为null的原因(提示:在评论模型中使用user_id
上的状态验证)。
第二次拨打电话时,您可以在@places
而不是@place
(错字)上拨打电话。这会导致你的错误。
以下是解决问题的另一种方法:
def create
@place = Place.find(params[:place_id])
@comment = @place.comments.build(comment_params)
@comment.user_id = current_user.id
if @comment.save(comment_params)
redirect_to place_path(@place)
else
render "comments/_form"
end
end
不同之处在于,我们首先“建立”评论而不创建评论,但它将填充地点的ID等。
在下一步中,我们添加当前用户的id,然后我们在对象上调用save,它会访问数据库。