前提・実現したいこと
Ruby on Railsで投稿アプリを作成しています。
ログアウト時でも投稿画面一覧が表示できるようにしたいです。
発生している問題・エラーメッセージ
いいね機能を実装した後にログインしているときは投稿一覧画面が表示されるのですがログアウトして投稿一覧画面のリンクを押すとエラーが発生してしまいます。
NoMethodError in Tweets#index undefined method `already_favorited?' for nil:NilClass
該当のソースコード
haml
1#投稿一覧画面のコードです 2.TweetMain 3 .TweetMain__form 4 - @tweets.each do |tweet| 5 .TweetMain__menu 6 .TweetMain__body 7 = link_to user_path(tweet.user) do 8 = attachment_image_tag tweet.user, :profile_image, fallback: "no-image.png", class: "Tweetshow__image" 9 .TweetMain__body__name 10 = link_to user_path(tweet.user), class: "TweetMain__body__Name" do 11 = tweet.user.username 12 .TweetMain__body__date 13 = tweet.updated_at.strftime("%Y-%m-%d %H:%M") 14 .TweetMain__title 15 = link_to tweet_path(tweet), class: "TweetMain__Title" do 16 = tweet.title 17 .TweetMain__favorite 18 - if current_user.already_favorited?(tweet) ←ここがおかしいとエラーでは表示されます 19 = link_to tweet_favorites_path(tweet), method: :delete, class: "Favorite" do 20 = icon('fas', 'heart') 21 - else 22 = link_to tweet_favorites_path(tweet), method: :post, class: "Favorite" do 23 = icon('far', 'heart') 24 = tweet.favorites.count 25 26
class TweetsController < ApplicationController before_action :authenticate_user!, except: [:index] def index @tweets = Tweet.all end def show @tweet = Tweet.find(params[:id]) end def new @tweet = Tweet.new end def create @tweet = Tweet.new(tweet_params) @tweet.user_id = current_user.id if @tweet.save redirect_to tweet_path(@tweet), notice: '投稿に成功しました' else render :new end end def edit @tweet = Tweet.find(params[:id]) if @tweet.user != current_user redirect_to tweets_path, alert: '不正なアクセスです' end end def update @tweet = Tweet.find(params[:id]) if @tweet.update(tweet_params) redirect_to tweet_path(@tweet), notice: '更新に成功しました' else render :edit end end def destroy tweet = Tweet.find(params[:id]) tweet.destroy redirect_back(fallback_location: root_path) end private def tweet_params params.require(:tweet).permit(:title, :body) end end
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :username, presence: true, uniqueness: true attachment :profile_image has_many :tweets, dependent: :destroy has_many :favorites, dependent: :destroy def already_favorited?(tweet) self.favorites.exists?(tweet_id: tweet.id) end end
class Tweet < ApplicationRecord belongs_to :user attachment :image has_many :favorites, dependent: :destroy with_options presence: true do validates :title validates :body end # def already_favorited?(tweet) # self.favorites.exists?(tweet_id: tweet.id) # end end
試したこと
already_favorited?(tweet)の箇所に原因があると思い、tweet.rbにも同じ記述をしましたが
解決しませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 14:29 編集
2020/08/27 14:29
2020/08/29 16:14
2021/01/01 08:32