2015-01-22 3 views
0

Это мой текущий метод Create в CommentsControllerпроблемы с создания метода в CommentsController

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 

Upon переписанный метод создания, я получаю эту ошибку, когда Я стараюсь оставить комментарий: undefined method comments for nil:NilClass

Помогите мне понять, как правильно переписать этот метод Create, пожалуйста?

Sidenote - Не уверен, что, если это актуально, если да, пожалуйста, адрес его, если нет, пожалуйста, игнорировать

После проверки последний комментарий в консоли рельсы, я был поражен, увидев, что user_id является ноль, тогда как для места это не так.

Место принадлежит к пользователю Комментария принадлежит к пользователю

Пользователя имеет много как Место и комментарий

+1

У вас есть опечатка. Вероятно, это должно быть \ @place not \ @places в вашем операторе if. –

+0

@AndreasGnyp, спасибо, что указал. Ценить это. – user273072545345

ответ

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 

Разница заключается в том, что мы первые «построить» комментарий, не создавая его, но она будет заполнена с идентификатором места и т.д.

В следующем шаге мы добавляем идентификатор текущего пользователя, а затем вызываем сохранение объекта, который попадает в базу данных.

+0

ах спасибо. оцените объяснение. – user273072545345

+0

эй, только что заметил первую строчку в вашем ответе о том, что комментарий был отправлен дважды. На самом деле это не так. Но ваш ответ помог. Это просто попытка обернуть мой разум вокруг кода, и быть хорошим в этом сводит меня с ума, понимаешь? знак равно – user273072545345

Смежные вопросы