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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

1608閲覧

いいね機能実装後に起きたNoMethodError

maeshu

総合スコア1

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/27 14:09

前提・実現したいこと

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にも同じ記述をしましたが
解決しませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Haml

1- if current_user.already_favorited?(tweet) ←ここがおかしいとエラーでは表示されます

current_userがnilです。

Ruby

1before_action :authenticate_user!, except: [:index]

indexでauthenticateを除外しているからじゃないでしょうか。

投稿2020/08/27 14:15

Cojiro

総合スコア539

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

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

maeshu

2020/08/27 14:29 編集

@kojiro12345 さん回答ありがとうございます。 ログアウト時でも投稿一覧が見れるようにするにはどのような記述が追加で必要になるのでしょうか。 いいね機能実装前では見ることができました。
Cojiro

2020/08/27 14:29

これは簡単だと思うので自分で考えた方がいいかと。 じゃないと、自分で解決する力が養われないと思います。 自然言語で言うならば、 current_userがnilじゃない場合(current_userが存在している場合)に  という分岐を追加すればいいと思います。
maeshu

2020/08/29 16:14

返信が遅くなりすいません。 試行錯誤して解決致しました、ありがとうございました。
auk63299

2021/01/01 08:32

全く同じエラーで詰まっております。maeshu様、恐縮ですが、どうやってエラーを解決できたか教えていただけますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問