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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Ruby on Rails

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

HTML

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

Q&A

解決済

1回答

3500閲覧

ActionView::Template::Error (undefined method `like_user' for nil:NilClass):が出ることでajaxがうまく動かない

odennkunn

総合スコア16

Ruby

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2019/12/07 01:46

編集2019/12/07 02:23

前提・実現したいこと

いま記事投稿サイトのようなものを作っており、その中でいいね機能を実装しようとしています。
画面の表示などはできるのですが、以下のエラーが出ることでうまくajax通信ができません。
もしわかる方いらっしゃいましたらご教授していただきたいです。

発生している問題・エラーメッセージ

ActionView::Template::Error (undefined method `like_user' for nil:NilClass):

ターミナル

Rendering likes/destroy.js.erb Rendered shared/_like.html.erb (12.8ms) Rendered likes/destroy.js.erb (24.9ms) Completed 500 Internal Server Error in 70ms (ActiveRecord: 2.0ms) ActionView::Template::Error (undefined method `like_user' for nil:NilClass): 1: <% if user_signed_in? %> 2: <% if @article.like_user(current_user.id) %> 3: <%= button_to article_like_path(article_id: @article.id), method: :delete, id: "like-button", remote: true do %> 4: <i class="fas fa-heart"></i> 5: <span>

該当のソースコード

app/view/shared/_like.html.erb

<% if user_signed_in? %> <% if @article.like_user(current_user.id) %> <%= button_to article_like_path(article_id: @article.id), method: :delete, id: "like-button", remote: true do %> <i class="fas fa-heart"></i> <span> <%= @article.likes_count %> </span> <% end %> <% else %> <%= button_to article_likes_path(@article), id: "like-button", remote: true do %> <i class="far fa-heart"></i> <span> <%= @article.likes_count %> </span> <% end %> <% end %> <% else %> <i class="far fa-heart"></i> <span> <%= @article.likes_count %> </span> <% end %>

app/view/likes/create.js.erb

$("#like-button").html("<%= j(render partial: 'shared/like', locals: { articles: @articles, likes: @likes, like: @like}) %>");

app/view/likes/destroy.js.erb

$("#like-button").html("<%= j(render partial: 'shared/like', locals: { articles: @articles, likes: @likes }) %>");

app/controller/likes_controller.rb

class LikesController < ApplicationController def create @like = Like.create(user_id: current_user.id, article_id: params[:article_id]) @likes = Like.where(article_id: params[:article_id]) @articles = Article.all @article = Article.where(id: params[:article_id]) end def destroy like = Like.find_by(user_id: current_user.id, article_id: params[:article_id]) like.destroy @likes = Like.where(article_id: params[:article_id]) @articles = Article.all @article = Article.where(id: params[:article_id]) end end

app/model/article

class Article < ApplicationRecord belongs_to :user has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy def like_user(user_id) likes.find_by(user_id: user_id) end mount_uploader :image, ImageUploader enum category: { Cook: 1, Beauty: 2, Clean: 3, Other: 4 }, _prefix: true validates :title, presence: true validates :text, presence: true validates :image, presence: true end

###考えたこと
問題箇所はlike_userだとはわかるのですが、modelで定義していてなぜundefined methodとなるのかがよくわかりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題箇所はlike_userだとはわかるのですが、modelで定義していてなぜundefined methodとなるのかがよくわかりません。

エラーメッセージのとおりで、@articleがモデルではなくnilになってしまっています。そして、コントローラーを見ても、@articleは定義されていません。

投稿2019/12/07 01:49

maisumakun

総合スコア145121

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

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

odennkunn

2019/12/07 02:25

ご指摘ありがとうございます。 コントローラーに@articleの記述を加えてみたのですが同じようなエラーが出てしまいます ActionView::Template::Error (undefined method `like_user' for #<Article::ActiveRecord_Relation:0x00007fefd0ed7138>):
maisumakun

2019/12/07 02:32

.whereで取れるものは、(仮に条件で絞っても)モデルの集合体であるリレーションです。 モデルの1要素だけ取りたい場合は、find_byなど別な手段が必要です。
odennkunn

2019/12/07 02:42

丁寧な解説ありがとうございます、修正して試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問