質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

解決済

Ajaxでいいね!値の更新がされない。

tomtom1
tomtom1

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1回答

0評価

0クリップ

1740閲覧

投稿2019/06/14 06:05

編集2022/01/12 10:58

###前提・実現したいこと

現在、Ajax無しではredirect_toで処理でいいね!処理をしている状態です。そこでAjaxと取り入れ、ページの更新無しに部分更新をしたく存じます。
https://qiita.com/naberina/items/c6b5c8d7756cb882fb20を参考に作っています。

しかし、いいね!ボタンを押すと、反応はなく、ページ更新すると反映されます。
ログを確認すると、jsファイルへpostの値をうまく渡せずにエラーを起こしています。

###エラー

Error

*いいね!create時 Started POST "/likes/3/create" for 127.0.0.1 at 2019-06-14 14:53:51 +0900 Processing by LikesController#create as JS Parameters: {"post_id"=>"3"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/application_controller.rb:6 Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" IS NULL LIMIT ? [["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:7 (0.1ms) begin transaction ↳ app/controllers/likes_controller.rb:9 CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:9 Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:9 Like Create (0.5ms) INSERT INTO "likes" ("user_id", "post_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["user_id", 1], ["post_id", 3], ["created_at", "2019-06-14 05:53:51.570765"], ["updated_at", "2019-06-14 05:53:51.570765"]] ↳ app/controllers/likes_controller.rb:9 (1.0ms) commit transaction ↳ app/controllers/likes_controller.rb:9 Rendering likes/create.js.erb Rendered likes/create.js.erb (18.0ms) Completed 500 Internal Server Error in 112ms (ActiveRecord: 2.2ms) ActionView::Template::Error (undefined method `id' for nil:NilClass): 1: $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>"); app/views/likes/create.js.erb:1:in `_app_views_likes_create_js_erb___1624215930080801267_70224208720440' *いいね!destroy時 Started POST "/likes/3/destroy" for 127.0.0.1 at 2019-06-14 14:46:30 +0900 Processing by LikesController#destroy as JS Parameters: {"post_id"=>"3"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/application_controller.rb:6 Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" IS NULL LIMIT ? [["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:15 Like Load (0.2ms) SELECT "likes".* FROM "likes" WHERE "likes"."user_id" = ? AND "likes"."post_id" = ? LIMIT ? [["user_id", 1], ["post_id", 3], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:16 (0.1ms) begin transaction ↳ app/controllers/likes_controller.rb:17 Like Destroy (0.4ms) DELETE FROM "likes" WHERE "likes"."id" = ? [["id", 27]] ↳ app/controllers/likes_controller.rb:17 (1.0ms) commit transaction ↳ app/controllers/likes_controller.rb:17 Rendering likes/destroy.js.erb Rendered likes/destroy.js.erb (22.8ms) Completed 500 Internal Server Error in 116ms (ActiveRecord: 2.0ms) ActionView::Template::Error (undefined method `id' for nil:NilClass): 1: $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>"); app/views/likes/destroy.js.erb:1:in `_app_views_likes_destroy_js_erb__3123402465132948964_70224203960620'

ちなみに、@post→postに変更した場合、ActionViewはこのような記載になります。

Error

*いいね!create時 ActionView::Template::Error (undefined local variable or method `post' for #<#<Class:0x00007fbcb1769a60>:0x00007fbcad37bd30> Did you mean? @post @posts): 1: $('#likes_buttons_<%= post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: post}) %>"); *いいね!destroy時 ActionView::Template::Error (undefined local variable or method `post' for #<#<Class:0x00007fbcb1769a60>:0x00007fbcb16a9cd8> Did you mean? @post @posts): 1: $('#likes_buttons_<%= post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: post}) %>");

###コード

index

<% @posts.each do |post| %> <div id='likes_buttons_<%= post.id %>'> <%= render partial: 'likes/like', locals: { post: post} %> </div> <% end %>
*_like.html.erb <% if Like.find_by(user_id: @current_user.id, post_id: post.id) %> <%= link_to("/likes/#{post.id}/destroy", method: :post, remote: true) do %> <span class="fa fa-heart icon-size like-btn-unlike"></span> <% end %> <% else %> <%= link_to("/likes/#{post.id}/create", method: :post, remote: true) do %> <span class="fa fa-heart icon-size like-btn"></span> <% end %> <% end %> <%= Like.where(post_id: post).count %>

js

*create.js.erb $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");

js

*create.js.erb $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");

js

*application.js //= require rails-ujs //= require jquery //= require jquery_ujs //= require activestorage //= require turbolinks //= require_tree .

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hatsu
hatsu

2019/06/14 14:58

likes_controller\.rb?のようないいねを動作しているコントローラー(LIkeクラスのCreateメソッドとか)があれば見せていただけると参考になりそうです\.\.\.!
tomtom1
tomtom1

2019/06/16 12:34

ありがとうございます!追記致しましたので、ご確認頂ければ幸いです!

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。