#はじめに
Rails 5.2
Ruby 2.5.0
PostgreSQl
slimを使用しています。
#実現したいこと
フォローしているユーザとログインしているユーザの投稿を投稿時間で降順に一覧表示したいです。
#現状
一覧表示ができていますが、
下記のようにユーザー1の投稿一覧(新しい順)⇛ユーザー2の投稿一覧(新しい順)....のようになり、うまくタイムライン表示ができません。
ユーザー1 投稿1
ユーザー1 投稿2
ユーザー2 投稿1
ユーザー3 投稿1
ユーザー3 投稿2
ユーザー3 投稿3
#モデル
user.rb
ruby
1class User < ApplicationRecord 2 3...省略... 4 5 has_many :posts, dependent: :destroy 6 7 has_many :active_relationships, class_name: "Relationship", 8 foreign_key: "follower_id", 9 dependent: :destroy 10 has_many :passive_relationships, class_name: "Relationship", 11 foreign_key: "followed_id", 12 dependent: :destroy 13 has_many :following, through: :active_relationships, source: :followed 14 has_many :followers, through: :passive_relationships, source: :follower 15 16 def follow(other_user) 17 active_relationships.create(followed_id: other_user.id) 18 end 19 20 def unfollow(other_user) 21 active_relationships.find_by(followed_id: other_user.id).destroy 22 end 23 24 def following?(other_user) 25 following.include?(other_user) 26 end 27 28end 29
post.rb
ruby
1class Post < ApplicationRecord 2...省略... 3 belongs_to :user 4 has_many :likes, dependent: :destroy 5 6end 7
relationship.rb
ruby
1class Relationship < ApplicationRecord 2 belongs_to :follower, class_name: "User" 3 belongs_to :followed, class_name: "User" 4 validates :follower_id, presence: true 5 validates :followed_id, presence: true 6end 7 8
#うまくいっていないコード
slim
1#content_wrapper 2 p.list_title タイムライン 3 #post_list_wrapper 4 - @users = @current_user.following 5 - @users.each do |user| 6 - @posts = Post.where(user_id: user.id) 7 - @posts.sort_by{|post| post.created_at}.reverse 8 - if @posts.present? 9 - @posts.each do |post| 10 = render "posts/post_index", post: post 11 - else 12 p.no_posts 誰かをフォローしましょう!
上記コードでは、うまく表示できませんでした。
#試したコード
Teratail で似たような記事があり参考にしましたが、エラーがでました。
[Rails 5] フォローしているユーザーの投稿を表示するタイムラインを作りたい
slim
1#content_wrapper 2 p.list_title タイムライン 3 #post_list_wrapper 4 - @users = @current_user.following 5 - @users.each do |user| 6 - @posts = Post.where(user_id: user.id) 7 - @posts.sort_by!{|post| post.created_at}.reverse! 8 - if @posts.present? 9 - @posts.each do |post| 10 = render "posts/post_index", post: post 11 - else 12 p.no_posts 誰かをフォローしましょう!
ActionView::Template::Error (undefined method `sort_by!' for #<Post::ActiveRecord_Relation:0x00007fb0aedde468> Did you mean? sort_by): 6: - @users = @current_user.following 7: - @users.each do |user| 8: - @posts = Post.where(user_id: user.id) 9: - @posts.sort_by!{|post| post.created_at}.reverse! #ここがエラー 10: - if @posts.present? 11: - @posts.each do |post| 12: = render "posts/post_index", post: post
#フォローしているユーザの投稿のみを投稿時間で降順に並べ替えてタイムライン表示したい。
アドバイスをいただきたいです。
そして、なぜsort_by!
がエラーなのか教えて頂きたいです。
宜しくお願いします。
あなたの回答
tips
プレビュー