🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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回答

1316閲覧

railsの非同期通信が作動しないです。

asato2000

総合スコア22

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

投稿2021/01/10 09:22

前提・実現したいこと

現在railsでアプリを作っていて、そこで非同期通信のいいね機能を実装したいです。

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

Completed 500 Internal Server Error in 24ms (ActiveRecord: 2.6ms) ActionView::Template::Error (undefined method `id' for nil:NilClass): 1: $('#favorites_buttons_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: {post: @post}) %>");

該当のソースコード

posts/index <div class="row row-cols-md-3"> <% @posts.each do |post| %> <div class="col-md-3"> <div class="card"> <%= attachment_image_tag post, :post_image, class: "card-img-top"%> <div class="card-body"> <h4 class="card-title"><%=post.title%></h4> <h6 class="card-subtitle text-primary"><%=post.subject%></h6> <h6 class="card-subtitle text-muted"><%=post.teacher_name%></h6> <p class="card-text"><%=post.content%></p> <div class="text-center"> <% if current_user == post.user %> <%= link_to "削除", post, method: :delete, data: { confirm: "You sure?" }, class: 'btn btn-danger btn-sm' %> <%= link_to "編集", edit_post_path(post), class: "btn btn-success btn-sm"%> <%end%> <div id="favorites_buttons_<%= post.id %>"> <%= render partial: 'favorites/favorite_button', locals: { post: post} %> </div> </div> </div> </div> </div> <% end %> </div> <%=paginate @posts %>
favorites/controller class FavoritesController < ApplicationController before_action :authenticate_user! def create @favorite = current_user.favorites.create(post_id: params[:post_id]) end def destroy @post = Post.find(params[:post_id]) @favorite = current_user.favorites.find_by(post_id: @post.id) @favorite.destroy end end
_favorites_button <% if current_user.already_favorited?(post) %> <%= link_to post_favorites_path(post.id), method: :delete, remote: true do %> <i class="fas fa-heart"></i> <%end%> <%else%> <%= link_to post_favorites_path(post.id),method: :post, remote: true do %> <i class ="fas fa-heart"></i> <%end%> <%end%> <%=post.favorites.count%>
create.js.erb $('#favorites_buttons_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: {post: @post}) %>");
destroy.js.erb $('#favorites_buttons_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: {post: @post}) %>");

何か足りないソースコードなどがあれば是非お願いします!!

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

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

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

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

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

m.ts10806

2021/01/10 09:57

@posts コントローラで定義されてないようですが、そのあたりはデバッグされましたか?
hatsu

2021/01/10 10:00

こちらはいいね(favorite)を削除するときも同じエラーがでていますか?
asato2000

2021/01/10 11:38

いえ、いいね(favorite)を削除するときは非同期で動きます!
guest

回答2

0

ベストアンサー

create.js.erb で使われている @post が def create で用意されて居ないためのエラーです。
@post = Post.find(params[:post_id])
を追加。

投稿2021/01/11 00:45

winterboum

総合スコア23567

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

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

0

エラーメッセージ

ActionView::Template::Error (undefined method `id' for nil:NilClass):

1: $('#favorites_buttons_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: {post: @post}) %>");

の「undefined method `id' for nil:NilClass」という部分から推測すると、@postが nil であることが直接の原因です。

favorites/controllerの def destroy にある

@post = Post.find(params[:post_id])

の右辺が nil と考えられますので、上記コードで使われている変数等の値を確認してください。

投稿2021/01/10 10:17

fumu7

総合スコア121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問