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

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

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

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

Ruby on Rails

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

881閲覧

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

kokemaru2427

総合スコア8

Ruby

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

Ruby on Rails

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/01 09:08

前提・実現したいこと

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ページを表示させるにはどのような記述をすれば実装可能かがわからない。

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

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

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

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

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

guest

回答2

0

if current_user
という、条件をつけることで解決。

投稿2021/03/01 10:13

kokemaru2427

総合スコア8

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

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

0

ベストアンサー

favoritするのも削除するのもLoginしている時に、でしょうから

- if current_user - 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')

と。

投稿2021/03/01 09:33

winterboum

総合スコア23329

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

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

kokemaru2427

2021/03/01 10:12

解決できました!ありがとうございました!! 今回は今までの中でも、考え方次第で簡単に解決できる内容であったことに 勉強が全然足りていないことを痛感しました、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問