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

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

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

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

Ajax

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

Q&A

解決済

2回答

503閲覧

RailsでAjaxを使って「お気に入り機能」を付けたがうまく動かない

NN77

総合スコア59

Ruby on Rails 5

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

Ajax

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

0グッド

1クリップ

投稿2019/02/04 05:28

編集2019/02/04 12:18

前提・実現したいこと

ある施設の検索サイトを作っています。
施設詳細ページで「お気に入り登録をする」「お気に入りを外す」をAjaxを使って動かしたいと思いました。

参考にした情報
https://qiita.com/naberina/items/c6b5c8d7756cb882fb20

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

Ajaxを実装しているつもりなのですが、、
リロードしないと登録済み・登録削除済の状態を表示できないでおります。

該当のソースコード

リロードすると実行できているので、
おそらくコントローラーやviewの問題出なく、jsの処理で何かが漏れているのだと思うのですが、
自分で原因を見つけられずにおります。原因の想定がつくかたがいらっしゃれば、アドバイスいただけないでしょうかm_ _m

<show.html.erb>

<table> <tbody> <tr> <th>施設名</th> <td><%= @nursery.title %></td> </tr> <tr> <th>住所</th> <td><%= @nursery.address %></td> </tr> </tbody> </table> <div id="like_button_<%= @nursery.id %>"> <%= render partial: "like", :locals => { nursery: @nursery }%> </div>

<_like.html.erb>

<% if user_signed_in? %> <% like = current_user.likes.find_by(nursery_id: nursery.id) %> <% if like.present? %> <%= link_to("/nurseries/#{nursery.id}/likes/#{like.id}", method: :delete, id: "like-button", remote: true) do %> <i class="fa fa-minus unlike-btn">お気に入りから外す</i><br> <% end %> <% else %> <%= link_to("/nurseries/#{nursery.id}/likes", method: :post, id: "like-button", remote: true) do %> <i class="fa fa-star like-btn">お気に入り登録</i><br> <% end %> <% end %> <% else %> <i class="fa fa-star like-btn">お気に入り登録</i><br> <% end %>

<nurseries_controller>

def show @nursery = Nursery.find(params[:id]) end

<likes_controller>

def create @like = Like.new(user_id:current_user.id, nursery_id:params[:nurseries_id]) @like.save end def destroy @like = Like.find_by(user_id:current_user.id ,nursery_id:params[:nurseries_id]) @like.destroy end

<create.js.erb>

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

<destroy.js.erb>

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

<application.js>

//= require underscore //= require gmaps/google //= require jquery //= require jquery_ujs //= require_tree .

補足情報

gem 'jquery-rails'
のbundle installは完了しています。

ajaxが動かなかったページで検証画面を開くとエラー内容が確認できましたので、
添付もいたします。自分では色々検索しても読み解けませんでした。。
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

自己解決

コメントと重複しますが、以下の通りです。

以下を参照し対応。
https://teratail.com/questions/52657
その後も以下のエラーが出ておりましたが、
ActionView::Template::Error (Missing partial likes/_like, application/_like with {:locale=>[:en], :formats=>[:js, "application/ecmascript", "application/x-ecmascript",
結果的に_like.html.erbをviews/likesフォルダ下ではなく、view/nurseriesフォルダ下に置いていたことに気づき、解消されました。

ご回答いただいたh_daidoさん、誠にありがとうございました。
解決できたのはh_daidoさんが上記urlの質問でご回答されていた内容のおかげです。

投稿2019/02/05 01:08

NN77

総合スコア59

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

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

0

likes_controller.rbで@nurseryはセットされてますかね?
例えばこんなかんじです。

ruby

1 def create 2 @nursery = Nursery.find(params[:nurseries_id]) 3 @like = Like.new(user_id:current_user.id, nursery_id:) 4 @like.save 5 end 6 7 def destroy 8 @nursery = Nursery.find(params[:nurseries_id]) 9 @like = Like.find_by(user_id:current_user.id ,nursery_id:params[:nurseries_id]) 10 @like.destroy 11 end

controllerのbefore_actionでセットしているかもしれませんが...(そのほうが実装としてはDRYになってベターです)

投稿2019/02/04 08:57

h_daido

総合スコア824

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

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

NN77

2019/02/04 12:01

ありがとうございますm_ _m @nurseryはshow.html.erbの以下のコードで引き継いでいるのです。 <%= render partial: "like", :locals => { nursery: @nursery }%> like_controllerにも教えていただいたように記載して見ましたが、やはりajaxは動かぬままでございます。
h_daido

2019/02/04 13:08

create.js.erbやdestroy.js.erbは、createやdestroyから呼ばれるので、showからの引き継ぎは関係ない気がしますよ。 でも、どちらにしても、記載しても動かないということは、別の問題かもしれませんね。 chrom developerコンソールのnetworkタブの使い方はわかります? Ajaxのリクエストがあるはずなので、その中のResponse覗いたほうが早いかもしれないですね。
NN77

2019/02/04 14:33

そうなんですね。教えていただきありがとうございます。 chrome developerコンソールのnetworkタブを見てみたところ、 Failed to load resource: the server responded with a status of 500 () と出ていました。
NN77

2019/02/05 01:07

こちら自己解決いたしました。 以下を参照し、 https://teratail.com/questions/52657 その後も以下のエラーが出ておりましたが、 ActionView::Template::Error (Missing partial likes/_like, application/_like with {:locale=>[:en], :formats=>[:js, "application/ecmascript", "application/x-ecmascript", 結果的に_like.html.erbをviews/likesフォルダ下ではなく、view/nurseriesフォルダ下に置いていたことに気づき、解消されました。 ご回答いただいたh_daidoさん、誠にありがとうございました。 解決できたのはh_daidoさんが上記urlの質問でご回答されていた内容のおかげです。
h_daido

2019/02/05 04:05

解決できてよかったですね!
NN77

2019/02/05 12:02

ありがとうございます。ご回答いただけて非常に心強かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問