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

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

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

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

Ruby on Rails

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1997閲覧

rails api + axiosで「406 (Not Acceptable)」

kobaryo04ysh

総合スコア29

Ruby

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

Ruby on Rails

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/05/31 04:12

rails api + Reactで投稿一覧を表示する機能を作成していたときに発生したエラーについてです。

投稿一覧表示用のフロントエンドのコンポーネントPosts.tsxにて以下のようにaxiosを用いてapiからgetでデータを取ってきてとりあえずコンソールで表示しようとしたときに、

Posts.tsx

1const Posts: React.FC = () => { 2 3 useEffect(() => { 4 axios 5 .get('http://localhost:3001/posts') 6 .then((res) => { 7 console.log('投稿取得!!'); 8 console.log(res.data); 9 }) 10 .catch((error) => { 11 console.log('registration error', error); 12 }); 13 }, []); 14 15 return ( 16 <div> 17 <h1>こんにちは</h1> 18 </div> 19 ); 20};

コンソールにて以下のエラーが発生しました。

console

1GET http://localhost:3001/posts 406 (Not Acceptable) 2registration error Error: Request failed with status code 406 3 at createError (createError.js:16) 4 at settle (settle.js:17) 5 at XMLHttpRequest.handleLoad (xhr.js:62)

以下はナックエンド側のコードです。

routes.rb

routes.rb

1Rails.application.routes.draw do 2 resources :posts, only: [:index, :create] 3end

posts_controller.rb

posts_controller.rb

1class PostsController < ApplicationController 2 3 def index 4 @posts = Post.all 5 end 6 7 def create 8 @post = Post.new(post_params) 9 @post.save 10 redirect_to action: 'index' 11 end 12 13 private 14 15 def post_params 16 params.require(:post).permit(:title, :content) 17 end 18end

試したこと

主に2つ試しました。

①apiを叩くコードにheadersを追加

axios .get('http://localhost:3001/posts', { headers: { 'Content-Type': 'application/json' }, data: {}, }) .then((res) => { console.log('投稿取得!!'); console.log(res.data); }) .catch((error) => { console.log('registration error', error); });

②routesのアクションをonly: [:index]にし、posts_controllerからcreateアクションを削除

これはエラーメッセージにat createError (createError.js:16)という記載があったため、rails routesでルートを確認したところ、

/postsというルートは二つあり、一つはGETでアクションがposts#index、もう一つがPOSTでアクションがposts#create

だったため、createアクションが動いているのでは?と考え試しました。

これら2つ試しましたが、うまくいきませんでした。cros関連で問題でもあるのかとも思ったのですが、crosに関しては知識が全くなく、問題があるのかもわからず。。。以下はcrosの設定ファイルです。
cros.rb

cros.rb

1Rails.application.config.middleware.insert_before 0, Rack::Cors do 2 allow do 3 origins 'http://localhost:3000' 4 5 resource '*', 6 headers: :any, 7 methods: %i[get post put patch delete options head], 8 credentials: true 9 end 10 11 # 本番環境用のオリジン設定 12 allow do 13 origins 'https:<自身が設定するアプリのURL>' 14 15 resource '*', 16 headers: :any, 17 methods: %i[get post put patch delete options head], 18 credentials: true 19 end 20end

解決策のご教授お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://teratail.com/questions/297806
こちらにも似た質問を見つけましたが、レスポンスがjsonフォーマットになっていない可能性はないでしょうか。

いったんReact経由でなく、直接APIを呼んで想定しているフォーマットを返せている確認してみると良いかなと思いました。

投稿2021/05/31 05:24

gtakat

総合スコア206

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

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

kobaryo04ysh

2021/05/31 05:37

ありがとうございます!URLを参考にjsonのfromtを指定した結果、エラーは解決されました! ただ、dbに登録されているデータ(rails cから存在することは確認済み)が空になってしまっていて、No Content 204となってしまっているのですが、これはAPI周りの問題なのですかねー?
kobaryo04ysh

2021/05/31 05:47

ちなみに、rails dbで確認すると登録したデータはあるのですが、curlコマンドを叩くとデータがないというような感じになっています。
gtakat

2021/05/31 05:49

よかったです。 204になるのは別の原因っぽいですね。 contollerで値を返せていない感じがします。 controllerを見る限りだと render @posts などが必要そうです。 合わせて、Post.allの部分で値が取れているかもデバッグしてみると良さそうです。
kobaryo04ysh

2021/05/31 05:51

ありがとうございます。 posts_controllerのindexアクションでrender @postsを記述し忘れていたのが原因でした。 この度はありがとうございました!!
gtakat

2021/05/31 05:52

解決してよかったですー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問