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

質問編集履歴

3

誤字

2021/03/22 23:59

投稿

akayoshi
akayoshi

スコア0

title CHANGED
File without changes
body CHANGED
@@ -62,7 +62,7 @@
62
62
  has_many :articles
63
63
  has_many :comments, dependent: :destroy
64
64
  has_many :likes, dependent: :destroy
65
- has_many :like_stories, through: :likes, source: :article
65
+ has_many :like_articles, through: :likes, source: :article
66
66
  end
67
67
  ```
68
68
  article.rb

2

脱字

2021/03/22 23:59

投稿

akayoshi
akayoshi

スコア0

title CHANGED
File without changes
body CHANGED
@@ -20,7 +20,7 @@
20
20
  ./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js.Rails.handleRemote @ rails-ujs.js:652
21
21
  (anonymous) @ rails-ujs.js:172
22
22
  ```
23
- いいね機能を配置し投稿の詳細画面にて、ハートが黒の状態でいいねボタンを押すとconsole上でこのように表示されて、ボタンに変化は起きません。
23
+ いいね機能を配置している投稿の詳細画面にて、ハートが黒の状態でいいねボタンを押すとconsole上でこのように表示されて、ボタンに変化は起きません。
24
24
 
25
25
  しかしリロードボタンを押すと、ハートの色もいいねの数も更新されます。
26
26
  likesテーブルにも、いいねを押したuser_idや、いいねされた記事のidなどしっかり保存されています。

1

誤字、脱字

2021/03/22 02:36

投稿

akayoshi
akayoshi

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,15 +1,19 @@
1
1
  ### 前提・実現したいこと
2
2
  投稿した記事にいいね❤️をつけられるアプリを制作しております。
3
3
 
4
- いいねボタンを押すと、非同期にてハートの色が黒から赤に変化し
4
+ いいね❤️ボタンを押すと、非同期にてハートの色が黒から赤❤️に変化し
5
5
  いいねの数も変動するように設定したいです。
6
6
 
7
+ ※参考文献
8
+ [[Rails]いいね機能の非同期での実装!!!](https://qiita.com/hayabusa3703/items/2b916e652a1dc85bb6e3)
9
+
7
10
  ※イメージ動画
8
- https://gyazo.com/a84ecf33d907028182d0263e61826b66
11
+ [いいねを押した時](https://gyazo.com/a84ecf33d907028182d0263e61826b66)
9
12
 
10
13
 
11
14
  ### 発生している問題・エラーメッセージ
12
- ### show.html.erb Console上
15
+ ### show.html.erb
16
+ **Console**
13
17
  ```
14
18
  POST http://localhost:3000/articles/1/likes 500 (Internal Server Error)
15
19
  ./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js.Rails.ajax @ rails-ujs.js:216
@@ -27,8 +31,25 @@
27
31
  つまり現状、いいねボタンを黒から赤に変え、いいねの数を増やすcreateアクションは非同期化されてなく
28
32
  赤から黒に変え、いいねの数を戻すdestroyアクションは非同期化できているという状態です。
29
33
 
34
+ [現状の動画](https://gyazo.com/760ebb42c6a5b99cff71460a015aa5ac)
30
35
 
36
+
31
37
  ### いいね機能に関するソースコード
38
+
39
+ **create_likes_rb**
40
+ ```
41
+ class CreateLikes < ActiveRecord::Migration[6.0]
42
+ def change
43
+ create_table :likes do |t|
44
+ t.references :user, foreign_key: true
45
+ t.references :article, foreign_key: true
46
+ t.timestamps
47
+ end
48
+ end
49
+ end
50
+ ```
51
+ ※いいねの数をカウントする"likes_count"カラムは、articlesテーブルに追加しています。
52
+
32
53
  ### 各モデル
33
54
  user.rb
34
55
  ```
@@ -81,12 +102,106 @@
81
102
  end
82
103
  ```
83
104
 
105
+ ### コントローラー
106
+ **likes_controller.rb**
107
+ ```
108
+ class LikesController < ApplicationController
109
+ before_action :set_variables, only: [:create, :destroy]
84
110
 
111
+ def create
112
+ like = current_user.likes.new(article_id: @article.id)
113
+ like.save
114
+ end
85
115
 
116
+ def destroy
117
+ like = current_user.likes.find_by(article_id: @article.id)
118
+ like.destroy
119
+ end
120
+
121
+ private
122
+
123
+ def set_variables
124
+ @article = Article.find(params[:article_id])
125
+ @id_name = "#like-link-#{@article.id}"
126
+ end
127
+ end
128
+ ```
129
+
130
+ ### 部分テンプレート
131
+ **views/articles/show.html.erb**
132
+ ```
133
+ <%= render partial: 'articles/articles', locals: { article: @article } %>
134
+ ```
135
+ **views/articles/_articles.html.erb**
136
+ ```
137
+ <%= render 'likes/like', article: article %>
138
+ ```
139
+ **views/likes/_like.html.erb**
140
+ ```
141
+ <% if user_signed_in? %>
142
+ <div class="like-link" id="like-link-<%= article.id %>">
143
+ <% if current_user.likes.find_by(article_id: article.id) %>
144
+ <%= link_to article_like_path(article.id), method: :delete, remote: true do %>
145
+ <div class = "iine__button">❤️<%= article.likes.count %></div>
146
+ <% end %>
147
+ <% else %>
148
+ <%= link_to article_likes_path(article.id), method: :post, remote: true do %>
149
+ <div class = "iine__button">♡️<%= article.likes.count %></div>
150
+ <% end %>
151
+ <% end %>
152
+ </div>
153
+ <% end %>
154
+ ```
155
+
156
+ ### ajaxを使った非同期化
157
+ **views/likes/create.js.erb**
158
+ ```
159
+ $("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", article: @article )) %>');
160
+ ```
161
+ **views/likes/destroy.js.erb**
162
+ ```
163
+ $("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", article: @article )) %>');
164
+ ```
165
+
166
+ ### 各applicationファイル
167
+ **javascript/packs/application.js**
168
+ ```
169
+ require("@rails/ujs").start()
170
+ //= require jquery3 ##追記部分##
171
+ //= require rails-ujs ↓
172
+ //= require_tree . ↓
173
+ // require("turbolinks").start()
174
+ require("@rails/activestorage").start()
175
+ require("channels")
176
+ require('../preview')
177
+ ```
178
+ **views/layouts/application.html.erb**
179
+ ```
180
+ <!DOCTYPE html>
181
+ <html>
182
+ <head>
183
+ <title>GetReadySauna</title>
184
+ <%= csrf_meta_tags %>
185
+ <%= csp_meta_tag %>
186
+
187
+ <%= stylesheet_link_tag 'application', media: 'all'%>
188
+ <%= javascript_pack_tag 'application' %>
189
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> ##追記部分##
190
+ </head>
191
+
192
+ <body>
193
+ <%= yield %>
194
+ </body>
195
+ </html>
196
+ ```
197
+
198
+
86
199
  ### 試したこと
200
+ jQueryをGemfileに導入し、bundle installをしたのち、application.jsにjQueryを使用するための必要事項と思われるものを記載しました。
87
201
 
202
+ しかし非同期通信が行われなかったので、application.html.erbに ##追記部分## を記述したところ
88
- ここ問題に対て試しことを記載してください
203
+ destroyアクションだけは非同期で動くようなりましたが、createアクションは変わらず非同期では動きません
89
204
 
90
- ### 補足情報(FW/ツールのバージョンなど)
91
205
 
206
+ どうすればcreateアクションも非同期になるのかわからず、路頭に迷っています。。。
92
- ここにり詳細な情報を記載ださい。
207
+ どうかお力添えのほど、しくお願いたします