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

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

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

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

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

2回答

2311閲覧

[Rails] ajaxでLike機能を実装したが、リロードしないと反映されない

japomondo

総合スコア23

Ruby

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

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クリップ

投稿2017/07/09 10:19

編集2017/08/17 03:16

###前提・実現したいこと
ajaxによるLike機能を実装したいと考えています。

下記の参考エントリに基づきコードを書いたのですが、Likeボタンをクリックしても反応がありません。
コンソールに下記のエラーが出ていました。

Completed 500 Internal Server Error in 673ms (ActiveRecord: 29.7ms) ActionView::Template::Error (undefined local variable or method `plan' for #<#<Class:0x007fd3f5972d88>:0x007fd3f5965e30> Did you mean? plans): 4: |   5: = plan.likes_count 6: br 7: - elsif plan.like_user(current_user.id) 8: = button_to plan_like_path([likes, like], plan_id: plan.id), method: :delete, id: "like-button", remote: true do 9: span.heart 10: = image_tag("icon_red_heart.svg")

ところが、リロードするとLikeが増減しています。

Likeボタンを押すことで、ページ遷移無しでLikeが増減するようにしたいと思っています。

###参考にしたエントリー
http://qiita.com/YuitoSato/items/94913d6a349a530b2ea2
http://qiita.com/yukisaibai/items/0a84e8c02f423faa7891

###likes_controller.rb

class LikesController < ApplicationController before_action :set_likes before_action :authenticate_user! def create @like = Like.create(user_id: current_user.id, plan_id: params[:plan_id]) end def destroy like = Like.find_by(user_id: current_user.id, plan_id: params[:plan_id]) like.destroy end private def set_likes @likes = Like.where(plan_id: params[:plan_id]) end end

###/view/likes/_like.html.slim

- if current_user.nil? span.heart = image_tag("icon_red_heart.svg") |   = plan.likes_count br - elsif plan.like_user(current_user.id) = button_to plan_like_path([likes, like], plan_id: plan.id), method: :delete, id: "like-button", remote: true do span.heart = image_tag("icon_red_heart.svg") |   = plan.likes_count br - else = button_to plan_likes_path(plan), id: "like-button", remote: true do span.heart = image_tag("icon_heart.svg") |   = plan.likes_count br

###/view/likes/create.js.slim

| $("#like-button").html(" = j(render partial: 'like', locals: { plans: @plans, likes: @likes, like: @like }) | ");

###/view/likes/destroy.js.slim

| $("#like-button").html(" = j(render partial: 'like', locals: { plans: @plans, likes: @likes }) | ");

###補足情報
本番環境
・さくらVPS
・ubuntu 16.04
・nginx 1.10.3-0
・unicorn 4.9.0-2build2
・ruby 2.4.1p111 (2017-03-22 revision58053) [x86_64-darwin16]
・Rails 5.0.3

開発環境
・cloud9

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

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

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

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

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

guest

回答2

0

モデルのコードを見せていただくことってできますか?

投稿2017/07/10 09:08

muraket81

総合スコア10

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

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

japomondo

2017/07/10 12:28

class Room < ApplicationRecord has_many :likes, dependent: :destroy def like_user(user_id) # like拡張機能 likes.find_by(user_id: user_id) end end
japomondo

2017/07/10 12:29

コメントありがとうございます。↑がRoomのモデルです。
guest

0

正しい回答になってはいませんがcreateの中に一度binding.pryは仕掛けてみましたか?

def create binding.pry @like = Like.create(user_id: current_user.id, room_id: params[:room_id]) @likes = Like.where(room_id: params[:room_id]) end

↑のようにしてみてまずはエラーが出ているところを絞ってみるのはどうでしょうか

投稿2017/07/09 10:50

編集2017/07/09 10:52
hnts

総合スコア27

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

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

japomondo

2017/07/09 13:28

アドバイスありがとうございます。早速やってみました。↓のコードが原因というのは分かりました。 @like = Like.create(user_id: current_user.id, room_id: params[:room_id]) ↓のエラー文を考えてみて、Stringオブジェクトを入れないといけないのにFixnumオブジェクトを入れようとしていることが原因なのだろうなと思うのですが。 TypeError (no implicit conversion of Fixnum into String): user_idもroom_idもinteger型だよなぁ、と。
hnts

2017/07/09 14:02

```Like.create(user_id: current_user.id, room_id: 適当な数字)```はエラー起きますか?
japomondo

2017/07/10 06:56

はい、同様のエラーが起きました。
hnts

2017/07/10 07:19

Like.create(user_id: "1", room_id:"1") Like.create(user_id: 1, room_id:1) Like.create(user_id: "1", room_id:1) Like.create(user_id: 1, room_id:"1") コンソールでやると上記の4つはどうですか?
japomondo

2017/07/10 08:53

ご返信ありがとうございます。 すべて同じエラーが出ました。 TypeError: no implicit conversion of Fixnum into String
hnts

2017/07/10 09:16

コールバックとかしてます?
japomondo

2017/07/10 12:30

コメントありがとうございます。Roomクラスに関してはしていないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問