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

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

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

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

Ruby

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

Q&A

1回答

2619閲覧

railsの良いね機能のajax,がうまくいかない

kureyonyon

総合スコア13

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/05/24 23:31

今、Ruby_on_railsでアプリを作っていて、良いね機能のajaxを実装しようとしています。

良いね機能は実装できたのですが、ajaxがうまくいかずにページを手動で処理しなければうまくいかない状態です。
ログでエラーが確認できたのですが、原因がわからない状態です。

イメージ説明

ActionView::Template::Error (undefined method `id' for nil:NilClass):
1: ('#like-icon-post-<%= @product.id.to_s %>').
2: html('<%= link_to "いいね", like_path(@product, @like), method: :DELETE, remote: true, class: "loved hide-text" %>');
3:

というエラーなのですが、idにクラスが入っていないと思うのですが、何回やってもうまくいかず原因も特定できていないです。
ただ、処理自体はできているので、おそらくajaxで問題が起きていると思うのですが、どこで問題が起きているのでしょうか?

### <!---/likes/create.js.erb ---> ('#like-icon-post-<%= @product.id.to_s %>'). html('<%= link_to "いいね", like_path(@product, @like), method: :DELETE, remote: true, class: "loved hide-text" %>');
<!---likes/destroy.js.erb ---> $('#like-icon-post<%=@product.id.to_s %>').html('<%= link_to 'いいねを取り消す', product_likes_path(@product),method: :POST,remote: true,class: "love hide-text"%>');
#/likes_controller.rb class LikesController < ApplicationController def create @like=current_company.likes.build(like_params) @product = Product.find_by(id: params[:id]) if @like.save respond_to :js end end def destroy @like = Like.find_by(id: params[:id]) @product = Product.find_by(id: params[:id]) if @like.destroy respond_to :js end end private def like_params params.permit(:product_id) end end
<!--- /products/show.html.erb---> <div class="container"> <div class="row"> <div class="offset-md-2 col-md-8"> <br><br> <%= link_to @product.college.name, college_path(@product.college.id)%> <h2><%= @product.title %></h2> <p class="text-danger">¥<%= @product.price %></p> <div id="like-icon-post-<%= @product.id.to_s %>"> <% if @product.liked_by(current_company).present?%> <%= link_to "いいねを取り消す",product_like_path(@product.id, @product.liked_by(current_company)),method: :DELETE,remote: true, class: "loved hide-text"%> <% else %> <%= link_to "いいね",product_likes_path(@product),method: :POST,remote: true, class: "love hide-text"%> <% end %> </div> <% if @product.college == current_college %> <%= link_to("編集","/products/#{@product.id}/edit") %> <%= link_to("削除",@product,{method: "delete"}) %> <% end %> <br><br> <p><%= @product.content %></p> </div> </div> </div>

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

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

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

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

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

guest

回答1

0

ログを見るとparams.product_idの中にidがあるのでlikes_controllerの@productを次のように書き換えてみてください。

ruby

1 def create 2 @like=current_company.likes.build(like_params) 3 @product = Product.find_by(id: params[:product_id]) 4 if @like.save 5 respond_to :js 6 end 7 end

今はparams[:id]が空なので@productがnilになって、「nilにはidがないよ」というエラーが出ています。

投稿2019/05/26 23:49

mottox2

総合スコア299

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問