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

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

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

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

Q&A

解決済

1回答

263閲覧

Rails5で投稿に「いいね」機能を実装

ssk

総合スコア332

Ruby on Rails

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

0グッド

1クリップ

投稿2017/07/05 05:21

編集2017/07/05 05:22

###前提・実現したいこと
Railsチュートリアルを一通り終え、micropostに「いいね」機能の拡張を実装中です。
しかし、「いいね」の取り消しができません。お力添えいただけると助かります。

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

ActionView::Template::Error (undefined method `like_user' for nil:NilClass): 1: <% if micropost.like_user(current_user.id) %> 2: <%= button_to micropost_like_path(id:1, micropost_id: micropost.id), method: :delete, id: "like-button", remote: true do %> 3: <span> 4: <%= micropost.likes_count %>

###該当のソースコード

ruby

1#microposts_controller.rb 2def index 3 @micropost = current_user.microposts.build if logged_in? 4 @microposts = Micropost.all 5 @likes = Like.where(micropost_id: params[:micropost_id]) 6 end

ruby

1#likes_controller.rb 2class LikesController < ApplicationController 3 def create 4 @like = Like.create(user_id: current_user.id, micropost_id: params[:micropost_id]) 5 @likes = Like.where(micropost_id: params[:micropost_id]) 6 end 7 8 def destroy 9 @like = Like.find_by(user_id: current_user.id, micropost_id: params[:micropost_id]) 10 @like.destroy 11 @likes = Like.where(micropost_id: params[:micropost_id]) 12 end 13end

ruby

1#_like.html.erb 2<% if micropost.like_user(current_user.id) %> 3 <%= button_to micropost_like_path(@likes, micropost_id: micropost.id), method: :delete, id: "like-button", remote: true do %> 4 <span> 5 <%= micropost.likes_count %> 6 </span> 7 <% end %> 8<% else %> 9 <%= button_to micropost_likes_path(micropost),id: "like-button", remote: true do %> 10 <span> 11 <%= micropost.likes_count %> 12 </span> 13 <% end %> 14<% end %>

ruby

1#destroy.js.erb 2$("#like-buttons").html("<%= j(render partial: 'like', locals: { micropost: @micropost, likes: @likes }) %>");

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの通り、micropostが定義されていないだけです。

これで、つまづいているようでは先が長いと思います。精進してください

def createはうまく行っていることから
before_actionにset_micropostがあってそれに:destroyを追加すればいいのでしょうが
def destroyを下記のように書き換えればとりあえず動くでしょう。

ruby

1 def destroy 2 @like = Like.find_by(user_id: current_user.id, micropost_id: params[:micropost_id]) 3 @like.destroy 4 @micropost=Micropost.find(params[:micropost_id]) 5 @likes = @micropost.likes 6 end

投稿2017/07/05 07:36

moke

総合スコア2241

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

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

ssk

2017/07/07 04:24

返信が遅くなり、申し訳ございません。 回答、ありがとうございます。 micropost: @micropost, likes: @likes ↑ここがイマイチ理解できていませんでした><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問