前提・実現したいこと
いま記事投稿サイトのようなものを作っており、その中でいいね機能を実装しようとしています。
画面の表示などはできるのですが、以下のエラーが出ることでうまく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となるのかがよくわかりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/07 02:25
2019/12/07 02:32
2019/12/07 02:42