質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

757閲覧

モデルに定義したメソッドが使えない

Puchimaru24

総合スコア2

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/23 09:41

編集2020/10/24 04:42

前提・実現したいこと

今まで稼働していたタイムライン(/posts/index)が突如表示されなくなりました。どうやらpost.rbのuserメソッドの読み込みがうまくいってないようです。
どう解決すればいいのかわからないのでご教授ください。

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

index.html.erb

Ruby:index.html.erb

1<div class="main-content"> 2 <div class="container"> 3 <h1>TimeLine 4 <%= link_to(posts_new_path) do %> 5 <span> 6 <button type="button" class="btn btn-primary rounded-circle p-0" style="width:2rem;height:2rem;"> 78 </button> 9 </span> 10 <% end %> 11 </h1> 12 13 <% @posts.each do |post| %> 14 <div class="posts-index-item mb-20"> 15 <div class="posts-index-user"> 16 <!--avatar--> 17 <div class="posts-index-img d-inline"> 18 <%= link_to("/users/#{post.user.id}") do %> 19 <% if post.user.avatar.attached? %> 20 <%= image_tag post.user.avatar, class: "avatar-index rounded-circle mx-auto" %> 21 <% else %> 22 <img class="avatar-index rounded-circle mx-auto" src="<%= "/images/default_user.png" %>" alt="Userimage"> 23 <% end %> 24 <% end %> 25 </div> 26 <!--username--> 27 <div class="posts-index-username d-inline"> 28 <%= link_to post.user.username, "/users/#{post.user.id}", class: "text-dark font-weight-bold" %> 29 </div> 30 <span class="text-secondary"> 31<%= distance_of_time_in_words_to_now(post.created_at) %>前 32 </span> 33 </div> 34 <!--content--> 35 <div class="post-content"> 36 <%= link_to(post.content, "/posts/#{post.id}", class: "text-dark no-deco") %> 37 </div> 38 </div> 39 <% end %> 40 </div> 41</div> 42

post.rb

ruby:post.rb

1class Post < ApplicationRecord 2 validates :content, {presence: true, length: {maximum: 140}} 3 validates :user_id, {presence: true} 4 5 has_one_attached :avatar 6 7 def user 8 return User.find_by(id: self.user_id) 9 end 10end

試したこと

  • showアクションはうまくいっているのでやはりuserメソッドがおかしい
  • userメソッドが使われているところだけ切り取るとうまく描画されるのでやはりuserメソッドがおかしい

補足情報(FW/ツールのバージョンなど)

Ruby 2.6.3
rails 5.2.4.4
devise,activestorage導入済

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/10/24 03:51

エラーは全文載せてください。
Puchimaru24

2020/10/24 04:42

失礼しました。画像を添付しました。
guest

回答2

0

ベストアンサー

単に「user_idがnil、もしくはuserと対応しない値だった」だけではないでしょうか?


ご提示のPost#userのようなメソッドは、(あえて勉強としてやるなら別ですが)手で書くべきではありません。「belongs_to :user」と書くだけで、Post#userよりはるかに便利な機能性を手に入れられます。

投稿2020/10/24 04:52

maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Puchimaru24

2020/10/25 04:18

回答ありがとうございます。 勉強として記述していましたが、これからはbelongs_toを使っていきたいと思います。belongs_toとユーザー削除時の投稿削除で解決できそうです。
guest

0

user methodが動かないのではなく、指定したidのuserが居ないということでしょう。

Postのvalidationでuser_idの存在は確保していますが、それだけでは実在のidで無くても登録できてしまいます。

belongs_to を勉強してください

投稿2020/10/24 04:50

winterboum

総合スコア23376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Puchimaru24

2020/10/25 04:17

回答ありがとうございます。 おっしゃる通り、ユーザーを削除したのにそのユーザーの投稿が残っていたのが原因でした。belongs_toとユーザー削除時の投稿削除で解決できそうです。
winterboum

2020/10/25 05:07

では、user にhas_many を設定し、dependant: destory オプションしましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問