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

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

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

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

1221閲覧

railsアプリに非同期通信でいいね機能を実装したい。

negimaguro

総合スコア6

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2020/03/15 17:42

railsアプリに非同期通信でいいね機能を実装したい。

初めての質問になります。

同期通信で実装していた、いいね機能を非同期通信に変更したいのですが、viewが挙動せず困っております。

ターミナル上に下記のエラーメッセージが表示されております。

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

ActionView::Template::Error (undefined method `id' for nil:NilClass): 1: <% if current_user.already_good?(tweet) %> 2: <%= button_to "Good-del_#{tweet.goods.count}", tweet_goods_path(tweet), method: :delete, class: "btn-good-del", remote: true %> 3: 4: <% elsif user_signed_in? %>

該当のソースコード

index.html.erb <div class="contner2"> <div class="contner"> <%= render @tweets %> </div> <div class="image"> </div> </div> <%= paginate @tweets %>
_tweet.html.erb <div class="artcle-con"> <div class="nickname-date"> <div class="nickname"> <%= link_to "#{tweet.user.nickname}", "/users/#{tweet.user_id}", method: :get %> </div> <div class="date"> <%= tweet.created_at.strftime('%Y/%m/%d') %> </div> </div> <div class="artcle-text"> <%= simple_format(tweet.text) %> </div> <div class="artcle-btn"> <% if user_signed_in? && current_user.id == tweet.user_id %> <%= button_to "EDIT", "/tweets/#{tweet.id}/edit", method: :get, class: "btn-edit" %> <%= button_to "DELETE", "/tweets/#{tweet.id}", method: :delete, data: {confirm: "本当に削除しますか?" }, class: "btn-del" %> <% elsif user_signed_in? %> <%= render partial: 'tweets/good', locals: {tweet: tweet} %> <%= button_to "comment", "/tweets/#{tweet.id}/comments", method: :get, class: "btn-com" %> <% end %> </div> </div>
_good.html.erb <% if current_user.already_good?(tweet) %> <%= button_to "Good-del_#{tweet.goods.count}", tweet_goods_path(tweet), method: :delete, class: "btn-good-del", remote: true %> <% elsif user_signed_in? %> <%= button_to "Good_#{tweet.goods.count}", tweet_goods_path(tweet), method: :post, class: "btn-good", remote: true %> <% end %>
create.js.erb $(".good").html("<%= j(render partial: 'tweets/good', locals: {tweet: tweet}) %>");
goods_controller.rb class GoodsController < ApplicationController def create Good.create(tweet_id: good_params[:tweet_id], user_id: current_user.id) @goods=Good.all @tweets=Tweet.all end def destroy good=Good.find_by(tweet_id: params[:tweet_id]) good.destroy end private def good_params params.permit(:tweet_id) end end

試したこと

https://qiita.com/fumikao/items/373caa60b77f27f2dbdd

上記を参考にしましたが、挙動せず。

変数tweetにはidが含まれていたので、idが何を意味しているのか分からない状態です。

ご教授お願い致します。

補足情報(FW/ツールのバージョンなど)

windows
rails 5.2.1
Mysql
jQuery

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

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

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

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

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

guest

回答1

0

ベストアンサー

create.js.erb で locals: {tweet: tweet}) がよばれてますが、この tweetが class GoodsController create から渡っていないとおもうのですが。
logみると undefinedあたりのエラーが出ていませんか?

投稿2020/03/15 23:38

winterboum

総合スコア23282

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

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

negimaguro

2020/03/16 16:24

ご回答ありがとうございます。 ご指摘を受けたところを、Goods_Controllerのcreateアクションから値を持って来られるようにlocals: {tweet: @tweets}としました。 しかし、ログで ActionView::Template::Error (undefined method `id' for #<Tweet::ActiveRecord_Relation:0x00007f21c8135ee8> Did you mean? ids) というエラーが出てしまっている状態です。 これはcreateアクションから渡すべき値が渡せていないということなのでしょうか?
winterboum

2020/03/16 21:13

はい、_good.html.erbが期待しているのは、createされたTweetのインスタンスです。それを表示するのですから。 今はTweet全部をわたしていて、Tweetの配列(のようなもの)がわたってるのでそのエラーです
negimaguro

2020/03/17 16:55

度々ありがとうございます。 ご指摘いただいた箇所を、 def create @good=Good.create(tweet_id: good_params[:tweet_id], user_id: current_user.id) @tweets=Tweet.find(@good.tweet_id) end このように変更したところ、実装出来ました。 ご助力いただき、ありがとうございました!
winterboum

2020/03/17 20:31

渡すのは一つなので、@tweetsでなく@tweet にしたほうが良いです。
negimaguro

2020/03/18 13:50

ご指摘ありがとうございます。 単数・複数は意識しないと駄目ですね。 以後気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問