在CommentController中遇到创建方法的问题

时间:2015-01-22 23:26:58

标签: ruby-on-rails ruby

这是我在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

用户有很多地方和评论

1 个答案:

答案 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,它会访问数据库。