s_kajigo
@s_kajigo (kaji shogo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

current_userがnilとなってしまう。(undefined method `id' for nil:NilClass)

Rails apiで投稿された日記にいいねする機能の実装を試みています。
認証機能にdevise,devise_token_authを使用しています。

投稿された日記一覧から選択された日記のidをパラメーターとして受け取り、ログイン中のユーザーのidと合わせて中間テーブルに保存することで機能することを想定しています。
ログインした状態でリクエストを送っているのですが、コントローラー部分のcurrent_api_v1_userのがnilのためidを参照できないとエラーが出てしまいます。

コントローラー

likes_controllers.rb
class Api::V1::LikesController < ApplicationController

 def create
#current_api_v1_userがnilでエラーとなる
   like = Like.find_or_initialize_by(user_id: current_api_v1_user.id,diary_id: likes_params[:diary_id])
  if like.save
    render json:{ status: 200, like:like.diary }
  else
    render json:{ status: 500, message:"登録に失敗しました。"}
  end
 end

 private
  def likes_params
    params.permit(:user_id, :diary_id)
  end

end

リクエスト部分

diary.js
export const like = (diaryId) => {
 return client.post(`/diaries/${diaryId}/likes`, {
  headers: {
   "access-token": Cookies.get("_access_token"),
   client: Cookies.get("_client"),
   uid: Cookies.get("_uid"),
  }
 });
};

別の機能では問題なくcurrent_userメソッドが使用できているので原因がわからず悩んでいます。
一応正常に機能している方も参考までに載せておきます。

diaries_controllers.rb
class Api::V1::DiariesController < ApplicationController
def index
  diaries=[]
#(このcurrent_api_v1_userはnilではなく正常に機能します。)
  diariesList = Diary.where.not(user_id: current_api_v1_user.id)
  diariesList.each do |diary|
    diaries << {
      diary: diary,
      user: diary.user,
      likes: diary.likes.count
    }
  end
  render json:{status: 200, diaries: diaries }
end

end

リクエスト部分

indexDiary.js
export const indexDiary = () => {
 return client.get("diaries", {
  headers: {
   "access-token": Cookies.get("_access_token"),
   client: Cookies.get("_client"),
   uid: Cookies.get("_uid"),
  }
 });
};

リクエストの方法はdiaryIdの有無くらいでヘッダー情報も同様にリクエストに含めているのですが、、、
初歩的な質問かとは思いますがご教授いただけたら幸いです。

0

1Answer

diary.js の client.post は axios でしょうか? だとすると headers は第3引数に渡す必要があります。以下のように変えてください。

client.post(`/diaries/${diaryId}/likes`, {}, { headers:  })

第2引数は JSON エンコードされてリクエストボディになります。

1Like

Comments

  1. @s_kajigo

    Questioner

    回答ありがとうございます。第三引数に変更して実装できました。
    なぜ参考に載せた方が正しく動いたのかもaxiosの引数について調べて理解できました。
    助かりました。

Your answer might help someone💌