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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

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

非同期処理

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

923閲覧

【rails】非同期通信でのいいね機能の実装【部分テンプレート】

shun0211

総合スコア4

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

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

非同期処理

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/05/29 23:00

編集2020/05/30 08:02

前提・実現したいこと

いいね機能を非同期通信で実装したいです。

ruby on railsを使ってユーザーがセットリストを投稿できる機能とそれに対していいねができるような機能を実装しようとしています。投稿に対していいねがついているかついていないかの判別するメソッドをモデルに定義しているのですが、部分テンプレートから読み込もうとするとNo method errorとなってしまいます。
一日中悩み続けております。何卒宜しくおねがいします。

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

terminal

1ActionView::Template::Error (undefined method `liked_by?' for nil:NilClass): 2 1: - if user_signed_in? 3 2: - if set_list.liked_by?(current_user) 4 3: = link_to event_set_list_likes_path(event, set_list), method: :delete, remote: true do 5 4: .like__box 6 5: .heart__mark__unregistered 7

該当のソースコード

setlistrb

1class SetList < ApplicationRecord 2 belongs_to :event, optional: true 3 belongs_to :user 4 has_many :likes, dependent: :destroy 5 has_many :comments, dependent: :destroy 6 7 validates :artist, :first_song, presence: true 8 validates :artist, uniqueness: true 9 10 def liked_by?(user) 11 likes.where(user_id: user.id).exists? 12 end 13end

試したこと

部分テンプレートからではなくviewに同じ記載をすると上記のようなエラーはでません。

参考にしたサイト

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

【部分テンプレート】

likehtmlhaml

1- if user_signed_in? 2 - if set_list.liked_by?(current_user) 3 = link_to event_set_list_likes_path(event, set_list), method: :delete, remote: true do 4 .like__box 5 .heart__mark__unregistered 6 &#9829 7 .like__number 8 = set_list.likes.count 9 - else 10 = link_to event_set_list_likes_path(event, set_list), method: :post, remote: true do 11 .like__box 12 .heart__mark__registered 13 &#9829 14 .like__number 15 = set_list.likes.count 16- else 17 .like__box 18 .heart__mark__registered 19 &#9829 20 .like__number 21 = set_list.likes.count

【view】

showhtmlhaml

1.button__box 2 .like__button 3 = render partial: "likes/like", locals: { event: @event, set_list: @set_list } 4 .twitter__box 5 %i.fab.fa-twitter

【controller】

likescontroller

1class LikesController < ApplicationController 2 def create 3 @like = Like.create(set_list_id: params[:set_list_id], user_id: current_user.id) 4 end 5 6 def destroy 7 @like = Like.find_by(user_id: current_user.id, set_list_id: params[:set_list_id]) 8 @like.destroy 9 end 10end

【JavaScript】

createjshaml

1$(".like__button").html("#{escape_javascript(render partial: 'like', locals: { event: @event, set_list: @set_list })}");

destroyjshaml

1$(".like__button").html("#{escape_javascript(render partial: "like", locals: { event: @event, set_list: @set_list })}");

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

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

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

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

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

m.ts10806

2020/05/29 23:40

Rubyでイイネを非同期 非常に良くみる質問ですが過去質問は何一つ参考にならなかったのでしょうか
shun0211

2020/05/29 23:50 編集

もちろん過去質問やqitta記事など参考にさせてはもらっているのですが、モデルのメソッドがno definedになっているケースはなかったので今回ご質問させていただきました。 自分が検索しきれていない可能性ももちろんありますが、、
m.ts10806

2020/05/29 23:52

調べたこと試したことは記載しましょう。書いてないことをやったこととしてみる人はなかなかいません(本当に何も調べず試さず丸投げする人との区別は不可能です) 調べたキーワード、参照した記事URLは必須です
shun0211

2020/05/30 07:00

承知いたしました。 参考サイトを記載しました。こちらの投稿では部分テンプレート内でモデルに定義したメソッドが使用できていまして、質問しているコードはできていないといった状況です。 何卒、宜しくお願いします。
guest

回答1

0

自己解決

今回の問題はモデルで定義したメソッドが使用できないという内容で相談させてもらいましたが、原因は
likesControllerでインスタンス変数を定義していないことでした。
以下のようにLikesControllerを修正することで解決しました。

class LikesController < ApplicationController def create @like = Like.create(set_list_id: params[:set_list_id], user_id: current_user.id) @set_list = SetList.find(params[:set_list_id]) #追加 @event = Event.find(params[:event_id])      #追加 end def destroy @like = Like.find_by(user_id: current_user.id, set_list_id: params[:set_list_id]) @set_list = SetList.find(params[:set_list_id]) #追加 @event = Event.find(params[:event_id])      #追加 @like.destroy end end

質問の仕方についてご指導いただいたm.ts10806さんありがとうございました。
次の質問では書いたこと調べたことについて記載するようにします。

投稿2020/05/30 08:19

shun0211

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問