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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

1472閲覧

Ajexが反応しない。 【いいね機能の実装】

ko-u

総合スコア61

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/12/16 15:16

編集2018/12/17 10:41

Ruby初学者です。

ご教授頂けると幸いです。

【いいね機能を実装したい】

【悩んでいること】
・Ajexが反応しない
→ブラウザを更新をすると反映はされるのですが、Ajexで切り替わりません。

【コード】
http://mochikichi.hatenablog.com/entry/rails_tutorial_like
こちらの記事を参考にしてイイね機能を作成しました。

likes/_like.html.erb

<% if post.like_user(current_user.id) %> <%= button_to post_like_path(likes, post_id: post.id), method: :delete, id: post.id, remote: true do %> <%= image_tag("icon_red_heart.png") %> <span> <%= post.likes_count %> </span> <% end %> <% else %> <%= button_to post_likes_path(post),id: post.id, remote: true do %> <%= image_tag("icon_heart.png") %> <span> <%= post.likes_count %> </span> <% end %> <% end %>

create.js.erb

$("#like-<%= @post.id %>").html("<%= j(render partial: 'like', locals: { post: @post, like: @like, likes: @likes }) %>");

destroy.js.erb

$("#like-<%= @post.id %>").html("<%= j(render partial: 'like', locals: { post: @post, likes: @likes }) %>");

likes_controller

def create @like = current_user.likes.find_or_create_by(post_id: params[:post_id]) @likes = Like.where(post_id: params[:post_id]) @post = Post.find(params[:post_id]) end def destroy like = current_user.likes.find_by(post_id: params[:post_id]) like.destroy @likes = Like.where(post_id: params[:post_id]) @post = Post.find(params[:post_id]) end

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

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

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

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

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

ykp_yk

2018/12/18 09:46

user.rbに定義されていると思いますがlike_userメソッドの内容を添付してください。 また、問題点として create.js.erbの実行ステータスが200になっているか、それともエラーなのかといった点などボタンを押した際のターミナルをよく確認してその情報を教えてください。
ko-u

2018/12/18 12:09

_like.html.erbをレンダリングしていた箇所にも、jsと同じidを指定することでAjexが反応しました。 ありがとうございました。
guest

回答3

0

自己解決

_like.html.erbをレンダリングしていた箇所にも、jsと同じidを指定することでAjexが反応しました。

ありがとうございました。

投稿2018/12/18 12:09

ko-u

総合スコア61

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

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

0

連続でクリックをすると一人のユーザーで複数のいいねがついてしまう。

likes♯createアクションの以下処理ですがこちらですと何度でもレコードが作られてしまいますね。

def create @like = Like.create(user_id: current_user.id, micropost_id: params[:micropost_id])

重複しないレコードを作成するようにするために find_or_create_by メソッドを使ってみると良いと思います。

http://railsdoc.com/references/find_or_create_by

def create @like = Like.find_or_create_by(user_id: current_user.id, micropost_id: params[:micropost_id])

また、こちらはUserがMicropostをいいねするという観点から以下の用なコードを書いた方が見通しが良いかもしれません。

user.rb has_many: likes
likes_controller.rb def create @like = current_user.likes.find_or_create_by(micropost_id: params[:micropost_id])

Ajexが反応しない

Ajaxが反応しないという情報だけですと何を確認すれば良いか判断がすぐにできませんが、ボタンが切り替わらないという症状でしょうか。
ボタンを押すとレコードは作成されているようですからjsの部分になりそうですね。
ボタンを押した後コンソールで create.js.erbがエラーなく正しくrenderされているかを確認してみてください。

$("#like-buttons").html("<%= j(render partial: 'like', locals: { post: post, like: @like, likes: @likes }

このコードからの推測となりますが セレクタ #like-buttons が一意ではないために正しいセレクタを指定する必要があると思います。

ボタンに一意のセレクタをつけ、jsで書き換えるようにしてみるとよさそうです(動作未検証です。)。

microposts/_micropost.html.erb <!--like拡張機能--> <div id="like-<%= micropost.id %>"> <%= render partial: 'likes/like', locals: { micropost: micropost, likes: @likes } %> </div>
likes_controller.rb def create @micropsot = Micropost.find(params[:micropost_id) @like = current_user.likes.find_or_create_by(micropost_id: @micropost.id)
likes/create.js.erb $("#like-<%= @micropost.id %>").html("<%= j(render partial: 'like', locals: { micropost: micropost, likes: @likes }) %>");

セレクタが正しく指定されているかを確認するために一旦以下のようなコードで試し、ボタンが切り替わるかを行ってみても良いと思います。

likes/create.js.erb $("#like-<%= @micropost.id %>").html("ボタン");

動作確認出来ましたら同じ要領でいいね解除の方も行ってみてください。

投稿2018/12/16 22:10

ykp_yk

総合スコア654

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

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

ko-u

2018/12/17 04:22

丁寧なご回答ありがとうございました! 余分にイイねされてしまう件に関しましては、find_or_create_byを使用することで解決致しました! Ajexが反応しない件に関しましては、ご指摘を頂いた通りに修正したのですが引き続きエラーが起こってしまっています。 エラー内容を追加致しましたので、ご教授頂けると幸いです。
guest

0

すいません。回答じゃないです。過去のko-uさんの質問で教えて頂きたいことがありまして、メールしてます。

今、https://teratail.com/questions/152541
と同じエラーにハマっていて、ko-uさんの「photoをリセットされて解決した。」とのコメントを読みましたが、どうやってやるのでしょうか。

私、半日ぐらいググったのですが、わからず失礼だと思いましたが、回答にて質問させて頂いてます。
もし宜しければ教えてください。

投稿2018/12/16 16:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ko-u

2018/12/16 16:18

僕は、rails db:migrate:resetでデータベースを作り直しました!
退会済みユーザー

退会済みユーザー

2018/12/16 17:19

回答ありがとうございます! データリセットできました!コマンドでやるんですね。 ただデータはリセットはできたのですが、 なぜかユーザー登録できなくなるエラーが起きて、悪戦苦闘中です。笑
ko-u

2018/12/17 03:43

僕の場合は、photoにvalidationをかけていたのにも関わらず、空のPhotoが入ってしまいエラーになっていたのでリセットで解決しましたが、 あいざわさんの場合では、実装面に問題があるようですね。。
退会済みユーザー

退会済みユーザー

2018/12/20 04:57

すいません!コメント気づきませんでした???? コメントも通知来るといいんだけど。。 右往左往しながら、最初からやり直してなんとかできました! でも、同じようなエラーになって私はrails db:resetでリセットした後、新規ユーザーを登録し直して、データを入れ直しました!
退会済みユーザー

退会済みユーザー

2018/12/20 04:58

あと、わたし、あいざわさんじゃないです。笑
ko-u

2018/12/20 06:08

いえいえ!全然大丈夫ですよ! てっきり通知が来るものだと思っていましたが、こないものなんですね・・・ おお、解決出来たみたいで良かったです!!
ko-u

2018/12/20 06:09

ユーザーネームがAizawaになっていたので、あいざわさんなのかと思っていました。。。泣 ごめんなさい泣
退会済みユーザー

退会済みユーザー

2018/12/20 06:56

そうなんです。。 通知がくる仕様にしてほしいです。笑 好きなキャラクラーからとりました!
ko-u

2018/12/21 15:06

キャラクターだったんですね! 思わず調べてみたら、熟女のグラドルが出て笑いました笑
退会済みユーザー

退会済みユーザー

2018/12/22 06:21

わたしも調べました!グラドルでしたね笑 名前変えよかな笑
ko-u

2018/12/22 12:42

逆に面白いので、このままで行きましょう笑
退会済みユーザー

退会済みユーザー

2018/12/24 13:11

そう言われたので、逆に変更してやろうと思いましたが回数制限があるので、ここままいきます(泣)
ko-u

2018/12/25 09:22

まさかの、回数制限・・・ というか、回数制限かかるほど名前を変更していたんですね笑
退会済みユーザー

退会済みユーザー

2018/12/25 09:24

いえいえ、なんかもともと2回まで? だったらしくて、もしもの時の為に残して置こうかと。
ko-u

2018/12/26 04:57

そうだったんですね。。。 2回だけって珍しいですね・・
退会済みユーザー

退会済みユーザー

2018/12/26 16:10

謎の回数制限です。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問