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

質問編集履歴

4

投稿一覧のコントローラと、Userモデルのfeedメソッド定義部分を載せました。

2021/06/29 10:12

投稿

NaoyaAbe
NaoyaAbe

スコア3

title CHANGED
File without changes
body CHANGED
@@ -49,7 +49,7 @@
49
49
 
50
50
  ```
51
51
  ```ここに言語を入力
52
- **likes_controller.rb** #追加しました!
52
+ **likes_controller.rb**
53
53
 
54
54
  class LikesController < ApplicationController
55
55
  before_action :authenticate_user!
@@ -73,6 +73,32 @@
73
73
  end
74
74
 
75
75
  ```
76
+
77
+ ```ここに言語を入力
78
+ ** posts_controller.rb ** #追加しました‼︎ 6/29
79
+ class PostsController < ApplicationController
80
+
81
+ def index
82
+ @posts = current_user.feed.eager_load(:user, :likes).page(params[:page]) #feedメソッドはUserモデルに定義
83
+ @post = Post.new
84
+ @like = Like.new
85
+ end
86
+
87
+ end
88
+
89
+ ** user.rb ** #追加しました‼︎ 6/29
90
+ class User < ApplicationRecord
91
+
92
+ def feed
93
+ following_ids = "SELECT following_id FROM relationships
94
+ WHERE follower_id = :user_id"
95
+ Post.where("posts.user_id IN (#{following_ids})
96
+ OR posts.user_id = :user_id", user_id: id)
97
+ end
98
+
99
+ end
100
+ ```
101
+
76
102
  ### 考えている解決策
77
103
  通常の投稿一覧ページへのアクセスではrenderを使用しない方法を考えているのですが、いいね機能の非同期処理を実装するにあたって_likeパーシャル作成は避けられないため、**コードが重複してしまう**ので、悩んでいます。
78
104
 
@@ -82,6 +108,7 @@
82
108
 
83
109
 
84
110
 
111
+
85
112
  ### 補足情報(バージョンなど)
86
113
  rails', '~> 5.2.1'
87
114
  ruby '2.6.6'

3

コードを修正しました。

2021/06/29 10:12

投稿

NaoyaAbe
NaoyaAbe

スコア3

title CHANGED
File without changes
body CHANGED
@@ -55,6 +55,7 @@
55
55
  before_action :authenticate_user!
56
56
 
57
57
  def create
58
+ @post = Post.find(params[:post_id])
58
59
  @like = current_user.likes.build(post_id: @post.id)
59
60
  @like.save
60
61
  respond_to do |format|
@@ -63,6 +64,7 @@
63
64
  end
64
65
 
65
66
  def destroy
67
+ @post = Post.find(params[:post_id])
66
68
  Like.find_by(post_id: @post.id, user_id: current_user.id).destroy
67
69
  respond_to do |format|
68
70
  format.js

2

likesコントローラを載せさせていただきました!

2021/06/16 13:29

投稿

NaoyaAbe
NaoyaAbe

スコア3

title CHANGED
File without changes
body CHANGED
@@ -47,10 +47,30 @@
47
47
 
48
48
  $("#post-#{@post.id}-likes").html("#{j(render('likes/like', post: @post))}");
49
49
 
50
+ ```
51
+ ```ここに言語を入力
52
+ **likes_controller.rb** #追加しました!
50
53
 
54
+ class LikesController < ApplicationController
55
+ before_action :authenticate_user!
51
56
 
57
+ def create
58
+ @like = current_user.likes.build(post_id: @post.id)
59
+ @like.save
60
+ respond_to do |format|
61
+ format.js
62
+ end
63
+ end
64
+
65
+ def destroy
66
+ Like.find_by(post_id: @post.id, user_id: current_user.id).destroy
67
+ respond_to do |format|
68
+ format.js
69
+ end
70
+ end
71
+ end
72
+
52
73
  ```
53
-
54
74
  ### 考えている解決策
55
75
  通常の投稿一覧ページへのアクセスではrenderを使用しない方法を考えているのですが、いいね機能の非同期処理を実装するにあたって_likeパーシャル作成は避けられないため、**コードが重複してしまう**ので、悩んでいます。
56
76
 

1

無関係なコードを削除

2021/06/16 13:27

投稿

NaoyaAbe
NaoyaAbe

スコア3

title CHANGED
File without changes
body CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  投稿に対するいいね機能を非同期(Ajax)で実装しています。
8
8
 
9
- いいねボタンを押した時にいいね解除ボタンを表示させるため、パーシャル(_likes.html.haml)を作成しています。
9
+ いいねボタンを押した時にいいね解除ボタンを表示させるため、パーシャル(_like.html.haml)を作成しています。
10
10
 
11
11
  いいねボタンを押したときにcreate.js.hamlにて、id: "post-#{post.id}-likes"のhtmlに_like.html.hamlをレンダリングする仕様です。
12
12
 
@@ -45,7 +45,7 @@
45
45
  ```ここに言語を入力
46
46
  **create.js.haml**
47
47
 
48
- $("#post-#{@post.id}-likes").html("#{j(render('likes/like', post: @post, likes_count: @post.likes.size))}");
48
+ $("#post-#{@post.id}-likes").html("#{j(render('likes/like', post: @post))}");
49
49
 
50
50
 
51
51