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

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

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

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

Q&A

解決済

1回答

1107閲覧

Ruby on Rails: イイね機能をつける時に発生したNoMethodErrorについて

Shoukenn

総合スコア6

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/30 08:14

編集2020/09/30 12:20

以下の手順でイイね機能をつける時にNoMethodErrorが発生しました。
エラーメッセージ
- Step1 モデル作成-

まずはじめに、テーブルの作成。

Cmd

1$ rails g model like article:references user:references 2$ rails db:migrate

次に、app/models/user.rbに追記。

class User < ApplicationRecord has_many :tweets, dependent: :destroy #追記箇所 has_many :likes, dependent: :destroy has_many :liked_tweets, through: :likes, source: :tweet #ここまで end

app/models/article.rbにも追記。

class Article < ApplicationRecord belongs_to :user #追記箇所 has_many :likes, dependent: :destroy has_many :liked_users, through: :likes, source: :user #ここまで end

そして、app/model/like.rbにバリエーションをつける。

class Like < ApplicationRecord belongs_to :user belongs_to :tweet #追記箇所 validates_uniqueness_of :tweet_id, scope: :user_id #ここまで end

次に def already_liked?について定義を。

class User < ApplicationRecord has_many :tweets, dependent: :destroy has_many :likes, dependent: :destroy has_many :liked_tweets, through: :likes, source: :post #追記箇所 def already_liked?(tweet) self.likes.exists?(tweet_id: tweet.id) end #ここまで end

-Step2 コントローラー作成-

まず、コントローラー作成。

Cmd

1$ rails g controller likes

つぎに、ルーティングを追記。

Rails.application.routes.draw do #変更前 resources :articles # #変更後 resources :articles do resources :likes, only: [:create, :destroy] end #

Likeコントローラーの中身の変更。

class LikesController < ApplicationController def create like = current_user.likes.create(tweet_id: params[:tweet_id]) #user_idとtweet_idの二つを代入 redirect_back(fallback_location: root_path) end def destroy like = Like.find_by(tweet_id: params[:tweet_id], user_id: current_user.id) like.destroy redirect_back(fallback_location: root_path) end end

articles_controller.rbのshowアクションに内容を追加していきます。

def show @article = Article.find(params[:id]) @like = Like.new end

-Step3 ビューの変更-

show.html.erbを以下のように書き換えます。

<h4>し か く  ちゃんねる</h4> <h1>資格い頻道</h1> <div class="article"> <p><%= @article.user.email %></p> <h3><%= @article.body %></h3> <p><%= @article.created_at %></p> <h3>いいね件数: <%= @article.likes.count %></h3> <% if current_user.already_liked?(@article) %> <%=link_to article_like_path(@article), method: :delete do%> <i class="fas fa-heart"></i>    <%end%> <% else %> <%=link_to article_likes_path(@article), method: :post do%> <i class="fas fa-heart"></i>    <%end%> <% end %> </div> <h2>いいねしたユーザー</h2> <% @article.liked_users.each do |user| %> <li><%= user.email %></li> <% end %> <%= link_to "編集する", edit_article_path(@article.id) %> <%= link_to "一覧に戻る", articles_path %>

index.html.erbに以下を追記します。
(エラーメッセージによると13行目にNoMethodErrorが発生)

<h4>し か く  ちゃんねる</h4> <h1>資格い頻道</h1> <h3>Article一覧</h3> <%= link_to "資格い頻道とは?", articles_top_path %> <%= link_to "新規投稿へ", new_article_path %> <div class="articles-container"> <% @articles.each do |t| %> <div class="article"> <%= t.title %><br> <%= t.content %><br> <%= t.category %><br> <%= t.user.email %><br> <% if current_user.already_liked?(t) %> <%=link_to article_like_path(id: t.id, article_id: t.id), method: :delete do%> <i class="fas fa-heart"></i><%=t.likes.count%> <%end%> <% else %> <%=link_to article_likes_path(id: t.id, article_id: t.id), method: :post do%> <i class="far fa-heart"></i><%=t.likes.count%> <%end%> <% end %> <%= t.created_at %><br> <br> </div> <% end %> </div>

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

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

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

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

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

gouf

2020/09/30 09:31

エラーの内容は 質問欄にコピペ可能ですか?
Shoukenn

2020/09/30 09:36

先ほど、エラーメッセージを質問文に追加しました。すみませんでした。
guest

回答1

0

ベストアンサー

current_userがnilだからエラーになっています。

erb

1<%= if current_user.present? && current_user.already_liked?(t) %>

deviseを使っているなら、user_signed_in?でもいいです。

current_userにデータが入ってないというのは、
おそらくcurrent_userにはログインしたユーザー情報が入っているかと思うので、
未ログインの人の場合にエラーが出ていると思います。
ログインしていない場合は、いいねをしてない扱いなのかなと思うので、上記のような回答にしました。

投稿2020/09/30 16:12

Cojiro

総合スコア539

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

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

Shoukenn

2020/10/01 01:38

先ほどarticleコントローラーの"before_action:authenticate_user!"を修正して、全頁のログイン必要としまして、イイね機能が順調に作動しました。ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問