前提・実現したいこと
Ruby on Railsで投稿アプリを作成しています。
ログアウト時でも投稿画面一覧が表示できるようにしたいです。
発生している問題・エラーメッセージ
いいね機能を実装した後にログインしているときは投稿一覧画面が表示されるのですがログアウトして投稿一覧画面のリンクを押すとエラーが発生してしまいます。
NoMethodError in Tweets#index undefined method `already_favorited?' for nil:NilClass
該当のソースコード
tweet.html.erb 投稿一覧画面のコードです。
.TweetMain .TweetMain__form - @tweets.each do |tweet| .TweetMain__menu .TweetMain__body = link_to user_path(tweet.user) do = attachment_image_tag tweet.user, :profile_image, fallback: "no-image.png", class: "Tweetshow__image" .TweetMain__body__name = link_to user_path(tweet.user), class: "TweetMain__body__Name" do = tweet.user.username .TweetMain__body__date = tweet.updated_at.strftime("%Y-%m-%d %H:%M") .TweetMain__title = link_to tweet_path(tweet), class: "TweetMain__Title" do = tweet.title .TweetMain__favorite - if current_user.already_favorited?(tweet) ←ここがおかしいとエラーでは表示されます = link_to tweet_favorites_path(tweet), method: :delete, class: "Favorite" do = icon('fas', 'heart') - else = link_to tweet_favorites_path(tweet), method: :post, class: "Favorite" do = icon('far', 'heart') = tweet.favorites.count
tweets コントローラーです
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
userモデルです。
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
tweetモデルです。
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
試したこと
エラーメッセージから、ログインしていないためcurent_userがnil(空)ということは理解することができたが、
nilであっても(ログアウト状態でも)indexページを表示させるにはどのような記述をすれば実装可能かがわからない。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。