teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

当初の該当コードから編集されているため、追記しました。

2020/09/09 07:42

投稿

max3252
max3252

スコア4

title CHANGED
File without changes
body CHANGED
@@ -190,6 +190,7 @@
190
190
  <%= render partial: 'likes/like', locals: { post: @post, likes: @likes}, id:"likes_buttons_" %>
191
191
  </div>
192
192
  ```
193
+ 追記:likesコントローラー、部分テンプレート、JavaScriptはサイト内の質問を参考に編集されています。
193
194
 
194
195
  ### 試したこと
195
196
 

1

サイト内の自分と同じ質問を参考に当初のエラーは解決しましたが、ページをリロードしないといいねが反映されずに非同期通信が実装できません。

2020/09/09 07:42

投稿

max3252
max3252

スコア4

title CHANGED
File without changes
body CHANGED
@@ -20,19 +20,36 @@
20
20
 
21
21
  1.トップページから投稿詳細ページへ遷移できない。
22
22
  これは、投稿者は詳細ページへ遷移できるが、投稿者以外のログインユーザーが詳細ページへ遷移しようとすると下記のエラーが発生するものです。
23
+ 追記:解決済み
23
24
 
24
25
  ```
25
26
  **NameError in Posts#show**
26
27
  undefined local variable or method `like' for #<#<Class:0x00007fdf2225dfb0>:0x00007fdf2225c458>
27
28
  ```
28
29
  2.投稿者本人が自分の投稿にもいいねが押せるはずだが、ログアウト状態者ようのなにも反応しない黒いハートのまま
30
+ 追記:解決済み
29
31
 
30
32
  3.いいねがされた数を表示するためのコードを書くとエラーが出てしまう。
33
+ 追記:解決済み
31
34
 
35
+ 4.ページをリロードするといいねが反映され、データベース上にも保存されるが、非同期通信ができない。
36
+
32
37
  ```
38
+ VM210:1 Uncaught ReferenceError: $ is not defined
39
+ at <anonymous>:1:1
40
+ at processResponse (rails-ujs.js:283)
41
+ at rails-ujs.js:196
42
+ at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.js:264)
43
+ (anonymous) @ VM210:1
44
+ processResponse @ rails-ujs.js:283
45
+ (anonymous) @ rails-ujs.js:196
46
+ xhr.onreadystatechange @ rails-ujs.js:264
47
+ XMLHttpRequest.send (async)
48
+ ./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js.Rails.ajax @ rails-ujs.js:216
49
+ ./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js.Rails.handleRemote @ rails-ujs.js:652
50
+ (anonymous) @ rails-ujs.js:172
51
+ 3index.js:13 Uncaught TypeError: Cannot set property 'src' of null
33
- **NoMethodError in Posts#show**
52
+ at slideshow_timer (index.js:13)
34
- undefined method `like_count' for #<Post:0x00007f54a50>
35
- Did you mean? like_user
36
53
  ```
37
54
 
38
55
  ### 該当のソースコード
@@ -48,18 +65,28 @@
48
65
  ```controller
49
66
  #いいね機能のコントローラー
50
67
  class LikesController < ApplicationController
68
+ before_action :set_post
51
69
 
52
70
  def create
53
71
  @like = Like.create(user_id: current_user.id, post_id: params[:post_id])
54
72
  @likes = Like.where(post_id: params[:post_id])
73
+ @like.save
74
+ @post = @like.post
55
75
  end
56
76
 
57
77
  def destroy
58
78
  like = Like.find_by(user_id: current_user.id, post_id: params[:post_id])
59
79
  like.destroy
60
80
  @likes = Like.where(post_id: params[:post_id])
81
+ @post.reload
61
82
  end
62
83
 
84
+ private
85
+
86
+ def set_post
87
+ @post = Post.find(params[:post_id])
88
+ end
89
+
63
90
  end
64
91
 
65
92
  ```
@@ -100,40 +127,70 @@
100
127
  #部分テンプレート views/likes/_like.html.erb
101
128
 
102
129
  <% if user_signed_in? %>
130
+
103
- <% if @post.like_user(current_user.id) %>
131
+ <% unless post.like_user(current_user.id).blank? %>
104
- <%= link_to post_like_path(like, post_id: post.id), method: :delete, id: "like-button", remote: true do %>
132
+ <%= link_to post_like_path(post_id: post.id ,id: post.likes[0].id), method: :delete, remote: true do %>
133
+ <div class="vertical_like">
105
- <%= image_tag("icon_red_heart.png") %>
134
+ <%= image_tag("icon_red_heart.png") %>
106
- <span>
135
+ <span class="red-text">
107
- <%= post.like_count %>
136
+ <%= post.likes_count %>
108
- </span>
137
+ </span>
138
+ </div>
109
139
  <% end %>
110
140
  <% else %>
111
- <%= link_to post_likes_path(@post.id), id: "like-button", remote: true do %>
141
+ <%= link_to post_likes_path(post.id), method: :post, remote: true do %>
142
+ <div class="vertical_like">
112
- <%= image_tag("icon_heart.png") %>
143
+ <%= image_tag("icon_heart.png") %>
113
- <span>
144
+ <span class="grey-text text-darken-2">
114
- <%= post.like_count %>
145
+ <%= post.likes_count %>
115
- </span>
146
+ </span>
147
+ </div>
116
148
  <% end %>
117
149
  <% end %>
150
+
118
151
  <% else %>
152
+
153
+ <% if post.likes_count > 0 %>
119
- <%= image_tag("icon_heart.png") %>
154
+ <div class="vertical_like">
155
+ <i class="material-icons red-text">favorite</i>
120
- <span>
156
+ <span class="red-text">
121
- <%= post.like_count %>
157
+ <%= post.likes_count %>
122
- </span>
158
+ </span>
159
+ </div>
160
+ <% else %>
161
+ <div class="vertical_like">
162
+ <i class="material-icons grey-text text-darken-2">favorite_border</i>
163
+ <span class="grey-text text-darken-2">
164
+ <%= post.likes_count %>
165
+ </span>
166
+ </div>
167
+ <% end %>
168
+
123
169
  <% end %>
124
170
 
171
+
172
+
125
173
  ```
126
174
  likeモデルにてcounter_cacheの記述を書いているので、post.like_countとするだけでその投稿に結びつくlike数が表示されます。と参考記事にありましたが、<%= post.like_count %>を書くとエラーが出てしまいます。
127
175
  ちなみにlike_countのカラムはpostテーブルに追加済みで、型はitegerで設定しています。
176
+ 追記:上記エラー解決済み
128
177
 
129
178
  ```js
130
179
  #views/likes/create.js.erb
131
- $("#like-buttons").html("<%= j(render partial: 'like', locals: { posts: @posts, likes: @likes, like: @like}) %>")
180
+ $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");
132
181
 
133
182
  #views/likes/destroy.js.erb
134
- $("#like-buttons").html("<%= j(render partial: 'like', locals: { posts: @posts, likes: @likes }) %>");
183
+ $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");
135
184
  ```
136
185
 
186
+ 追加:呼び出したい部分で↓
187
+
188
+ ```html
189
+ <div id="likes_buttons_<%= @post.id %>">
190
+ <%= render partial: 'likes/like', locals: { post: @post, likes: @likes}, id:"likes_buttons_" %>
191
+ </div>
192
+ ```
193
+
137
194
  ### 試したこと
138
195
 
139
196
  おそらく条件式を記事のままコピペしてしまったので、自分の実装したいいいね機能と異なる条件式になっていることはなんとなく理解できている。
@@ -143,4 +200,8 @@
143
200
 
144
201
  以上になります。
145
202
  他の情報が必要な場合は教えていただけると助かります。
146
- 宜しくおねがいします!
203
+ 宜しくおねがいします!
204
+
205
+ 追記:上記エラーの1,2,3はサイト内の"https://teratail.com/questions/245199"様の質問を参考に(正確には質問者様の参考サイト)解決いたしました。
206
+ ただ、非同期通信にはならず、新たに4のエラーがでています。こちらのエラーはサイト内の質問を参考にして色々試しましたが、現在も解決できていません。
207
+ アドバイスをいただける方がいましたらお願いします