起こったこと
フロントエンド(React Native)からhandleSubmit関数を実行した際に、サーバーサイド(Rails)で以下のエラーが発生しました。
Started POST "/api/v1/user_touring_groups" for xxx.xxx.y.y at 2023-12-06 21:40:43 +0900
Processing by Api::V1::UserTouringGroupsController#create as JSON
Parameters: {"user_touring_group"=>{"touring_group_id"=>118, "user_id"=>"3"}}
Filter chain halted as :authenticate_user! rendered or redirected
Completed 401 Unauthorized in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 1099)
handleSubmit関数は以下のとおりで、「post」「delete」に応じてフェッチ先のURLを変更しています。
今回は「post」の際にエラーが発生していました。
const handleSubmit = async (touringGroup, method) => {
let url = 'http://xxx.xxx.y.y:3000/api/v1/user_touring_groups';
if (method.toLowerCase() === 'delete') {
url = `${url}/${touringGroup.id}`;
}try {
const session = await retrieveUserSession();
if (!session) {
console.error('Session retrieval failed');
return;
}let requestOptions = {
method: method.toUpperCase(),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'access-token': session.token,
'user-id': session.userId,
},
};console.log(method.toUpperCase())
console.log(session.token)if (method.toLowerCase() === 'post') {
requestOptions.body = JSON.stringify({ user_touring_group: {
touring_group_id: touringGroup.id,
user_id: session.userId
} });
}let response = await fetch(url, requestOptions);
if (response.ok) {
console.log('操作成功');
// 追加の処理(必要に応じて)
} else {
if (response.status === 401) {
// 認証失敗時の処理
const errorData = await response.json();
console.error('認証エラー: ', errorData.error);
} else {
// その他のエラー処理
console.error('操作失敗: ステータスコード', response.status);
}
}
} catch (error) {
console.error('操作エラー', error);
}
};
結論
user_touring_groups_controller.rbの冒頭箇所をコード1からコード2に修正したところ、エラーがなくなりました。
コード1
class Api::V1::UserTouringGroupsController < ApplicationController
skip_before_action :verify_authenticity_token
before_action :authenticate_user_from_token!
コード2
module Api
module V1
class UserTouringGroupsController < ApplicationController
include DeviseTokenAuth::Concerns::SetUserByToken
# skip_before_action :verify_authenticity_token
before_action :authenticate_user_from_token!def create
コード1は古い書き方で、ユーザー認証の段階でDeviseが正常に機能しなかったのだと思います。