質問編集履歴
2
当初の該当コードから編集されているため、追記しました。
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
サイト内の自分と同じ質問を参考に当初のエラーは解決しましたが、ページをリロードしないといいねが反映されずに非同期通信が実装できません。
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
|
-
|
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
|
-
<%
|
131
|
+
<% unless post.like_user(current_user.id).blank? %>
|
104
|
-
<%= link_to post_like_path(
|
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
|
-
|
134
|
+
<%= image_tag("icon_red_heart.png") %>
|
106
|
-
|
135
|
+
<span class="red-text">
|
107
|
-
|
136
|
+
<%= post.likes_count %>
|
108
|
-
|
137
|
+
</span>
|
138
|
+
</div>
|
109
139
|
<% end %>
|
110
140
|
<% else %>
|
111
|
-
<%= link_to post_likes_path(
|
141
|
+
<%= link_to post_likes_path(post.id), method: :post, remote: true do %>
|
142
|
+
<div class="vertical_like">
|
112
|
-
|
143
|
+
<%= image_tag("icon_heart.png") %>
|
113
|
-
|
144
|
+
<span class="grey-text text-darken-2">
|
114
|
-
|
145
|
+
<%= post.likes_count %>
|
115
|
-
|
146
|
+
</span>
|
147
|
+
</div>
|
116
148
|
<% end %>
|
117
149
|
<% end %>
|
150
|
+
|
118
151
|
<% else %>
|
152
|
+
|
153
|
+
<% if post.likes_count > 0 %>
|
119
|
-
|
154
|
+
<div class="vertical_like">
|
155
|
+
<i class="material-icons red-text">favorite</i>
|
120
|
-
|
156
|
+
<span class="red-text">
|
121
|
-
|
157
|
+
<%= post.likes_count %>
|
122
|
-
|
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
|
-
$(
|
180
|
+
$('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");
|
132
181
|
|
133
182
|
#views/likes/destroy.js.erb
|
134
|
-
$(
|
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
|
+
アドバイスをいただける方がいましたらお願いします
|