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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

1684閲覧

rails devise-token-auth 適切なheadersを渡しているはずだがなぜかログインできない。

IRIESS

総合スコア45

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/11 04:29

編集2021/06/11 13:22

前提・実現したいこと

Ruby on railsとvue.jsを使用してSPAアプリを制作しています。
rails側でdevise-token-authを使用しログイン機能を実装しています。
必要なheadersは以下のように渡しているはずなんですが、なぜかログインしていることになりません。

一つ気になる点としまして、headersには認証に必要な3つ以外は記入していないのですが、なぜか"user_skill"という空の配列が渡されています

問題点、ご教授お願いいたします。

該当のソースコード

routes

1 POST /api/skills/:skill_id/user_skills(.:format) api/user_skills#create

usersilllscontroller

1def create 2 skill = Skill.find(params[:skill_id]) 3 user_skill = current_api_user.user_skills.new(skill: skill, user: current_api_user) 4 if user_skill.save 5 render json: user_skill, status: :created 6 else 7 render json: user_skill.errors, status: :bad_request 8 end 9 end

vue

1 2 3addTargetSkill(e) { 4 axios.post(`http://localhost:3000/api/skills/${e}/user_skills`, { 5 headers: { 6 uid: localStorage.getItem("uid"), 7 "access-token": localStorage.getItem("access-token"), 8 client: localStorage.getItem("client"), 9 } 10 }) 11 }, 12

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

ステータスコード500とメッセージが返ってきます

undefined method `user_skills' for nil:NilClass user_skill = current_api_user.user_skills.new(skill: skill, user: current_api_user) parametes {"headers"=>{"uid"=>"mochi@mochi.com", "access-token"=>"0CLH7UFQX-vdZ1gISwa7sg", "client"=>"ZhgcdJskhbOENZwAS1Tn3A"}, "skill_id"=>"30", "user_skill"=>{}}

試したこと

外部ツールpostmanを使用して同じリクエストを投げたところ成功しました。
なぜかはわかりません。。。
テストも書いているのですが、テストは成功します。。。

Rspec

1RSpec.describe "Api::UserSkills", type: :request do 2 let(:user) { create(:user) } 3 let(:skill) { create(:skill)} 4 let(:us) { create(:user_skill)} 5 let(:uid) { response.headers["uid"] } 6 let(:client) { response.headers["client"] } 7 let(:access_token) { response.headers["access-token"]} 8 before do 9 post "/api/user/sign_in", params: { email: user.email, password: user.password } 10 end 11 12 describe "POST /create" do 13 it "ログインすれば登録できる" do 14 post "/api/skills/#{skill.id}/user_skills", headers: {uid: uid, client: client, "access-token": access_token} 15 expect(user.skills.count).to eq(1) 16 end 17 end 18

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

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

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

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

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

guest

回答1

0

ベストアンサー

axiosを確認すると

axios.post(url[, data[, config]])

なので、空ポストするためには

js

1axios.post(`http://localhost:3000/api/skills/${e}/user_skills`, {} , { 2 headers: { ...

となるかと思います。

投稿2021/06/11 09:07

asm

総合スコア15149

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

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

IRIESS

2021/06/11 12:16 編集

IRIESS

2021/06/11 12:18

ありがとうございました。解決致しました。 テストではbodyに何も記入せずともパスしてしまったのですが。なぜでしょうか。。 ともあれ、ご教授ありがとうございました。
asm

2021/06/11 12:21

どういったテストでしょうか?
IRIESS

2021/06/11 13:24

追記したようなテストです。 汚い書き方かもしれませんが確認していただけると嬉しいです。。
asm

2021/06/11 13:52

axiosはjavascriptのライブラリで テストコードのpostはRuby(Rails)のメソッドだからです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問