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

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

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

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

Ajax

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

Q&A

1回答

330閲覧

ActionView::Template::Error: undefined method `like?' for nil:NilClass

sgs

総合スコア0

Ruby on Rails 6

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

Ajax

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

0グッド

0クリップ

投稿2022/03/30 05:21

編集2022/03/30 05:28

エラー

1) Error: UsersProfileTest#test_profile_display: ActionView::Template::Error: undefined method `like?' for nil:NilClass app/views/users/_like_form.html.erb:2 app/views/microposts/_micropost.html.erb:9 app/views/users/show.html.erb:19 test/integration/users_profile_test.rb:11:in `block in <class:UsersProfileTest>'

このエラーでAjaxが機能しないと思うのですが。

ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/favorites_controller.rb:7:in `create'

app/views/users/_like_form.html.erb

rb

1<div id="like_form"> 2 <% if current_user.like?(micropost) %> 3 <%= render 'favorites/unlike', micropost: micropost %> 4 <% else %> 5 <%= render 'favorites/like', micropost: micropost %> 6 <% end %> 7</div>

app/views/favorites/_unlike.html.erb

html

1<%= button_to favorite_path(micropost), method: :delete, remote: true do %> 2 <%= micropost.liked.count %> 3 <span style = "color:red;"></span> 4<% end %>

app/views/favorites/_like.html.erb

html

1<%= button_to favorites_path(micropost), method: :post, remote: true do %> 2 <%= micropost.liked.count %> 3 <span ></span> 4<% end %>

app/controllers/favorites_controller.rb

rb

1before_action :logged_in_user, only: [:create, :destroy] 2 3 def create 4 @micropost = Micropost.find_by(id: params[:format]) 5 current_user.like(@micropost) 6 respond_to do |format| 7 format.html { redirect_to request.referer } 8 format.js 9 end 10 end 11 12 def destroy 13 @micropost = Micropost.find_by(id: params[:id]) 14 current_user.unlike(@micropost) 15 respond_to do |format| 16 format.html { redirect_to request.referer } 17 format.js 18 end 19 end 20end

app/models/user.rb

rb

1. 2. 3. 4 # いいねする 5 def like(other_micropost) 6 likes << other_micropost 7 end 8 9 # いいね解除 10 def unlike(other_micropost) 11 favorites.find_by(micropost_id: other_micropost.id).destroy 12 end 13 14 # いいねしているか? 15 def like?(other_micropost) 16 likes.include?(other_micropost) 17 end 18. 19. 20.

app/views/favorites/create.js.erb

js

1$("#like_form").html("<%= escape_javascript(render(partial: 'favorites/unlike', locals: { micropost: @micropost })) %>");

app/views/favorites/destroy.js.erb

js

1$("#like_form").html("<%= escape_javascript(render(partial: 'favorites/like', locals: { micropost: @micropost })) %>");

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

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

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

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

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

guest

回答1

0

current_user が nill ということは loginしていないのでは? と思われます

投稿2022/03/30 09:21

winterboum

総合スコア23347

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

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

sgs

2022/03/30 10:30 編集

お忙しい中質問にご回答してくださりありがとうございます。 ``` <div id="like_form"> <%= debug current_user %> <% if current_user.like?(micropost) %> <%= render 'favorites/unlike', micropost: micropost %> <% else %> <%= render 'favorites/like', micropost: micropost %> <% end %> </div> ``` デバッグをすると中身が表示されました。 ``` --- !ruby/object:User concise_attributes: - !ruby/object:ActiveModel::Attribute::FromDatabase name: id value_before_type_cast: 1 . . . active_record_yaml_version: 2 ``` これでもnil扱いになるのでしょうか?
winterboum

2022/03/30 10:56

はて、、 これなら nil ではないですね。 この場合も 同じエラーになりましたか?
sgs

2022/03/30 13:05 編集

返信に遅れました。申し訳ございません。 ご返信ありがとうございます。 これでもエラーになりました。 仮に@userと入力すると ``` <div id="like_form"> <%= debug current_user %> <% if @user.like?(micropost) %> <%= render 'favorites/unlike', micropost: micropost %> <% else %> <%= render 'favorites/like', micropost: micropost %> <% end %> </div> ``` テストのエラーがなくなるのでcurrent_userが問題だと思います。 ・Ajax無しでもこのエラーは起ります。 ・Ajax無しの時は見た目上は問題なく動きます。 あとはファイルの位置が悪いのでしょうか? まだ他のテストを書いていないので やれるところはやってみようかなと思っています。 あとは今のところはajaxは諦めて後に回そうと思っています。 繰り返しになりますが、ご協力ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問