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

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

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

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

Q&A

解決済

2回答

1456閲覧

railsのredirect_toでpathが変更されてしまう

yasushi-kibou

総合スコア6

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/10/25 02:28

前提・実現したいこと

Rails5.2.4.3 Ruby2.6.3環境でアプリケーション構築しています。
コントローラにてDB登録成功し、redirectさせようとしています。
しかし下記のリダイレクトURLが変ってしまう事象の為リダイレクトできません。
同様の事象に合われ、解決された方のお知恵をお借りしたいです。

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

redirect_to メソッドでurlを指定して実行していますが、
ログ上に以下が出力され、リダイレクトできません。

Redirected to http://localhost:3000/XXXX/YY
Completed 406 Not Acceptable in 200ms (ActiveRecord: 119.1ms)
ActionController::UnknownFormat (ActionController::UnknownFormat):
となります。

該当のソースコード

url = '/XXXX/' + YY
redirect_to url

試したこと

Fidderツールで見たところ、該当のリクエストのurlが
/XXXX/YYではなく、自身のコントローラパスになっており、
さらにContent-Typeが、text/htmlではなく、text/plainになっていました。
おそらくこれが、UnknownFormat の原因だと思います。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

自己解決

本件解決しました。コントローラのredirect_toにばかり目がいっていましたが、
原因はformタグの指定が、画面更新を非同期で行う様な指定になっていたためでした。
以下記事を見てわかりました。

http://tokyo.supersoftware.co.jp/technology/8006

<%= form_with model:@XXXX_XXXX do |f| %>

としていたところ、以下の様にlocal: trueを追加しました。

<%= form_with model:@XXXX_XXXX, local: true do |f| %>

ご協力頂きましたwinterboum様には、貴重な日曜日にお時間頂き最後までご丁寧な回答を頂き
感謝致します。本当に有難うございました。

投稿2020/10/25 07:33

yasushi-kibou

総合スコア6

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

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

winterboum

2020/10/25 07:37

詳細を隠すと正しい質問にならないのです
guest

0

url = '/XXXX/' + YY の結果は '/XXXX/YY' でしょうか?
でしたら http://localhost:3000/XXXX/YY へredirectしようと言うのは正しい動きです。
実際にはどこに行きたいのでしょう?

投稿2020/10/25 03:30

winterboum

総合スコア23567

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

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

yasushi-kibou

2020/10/25 03:36

早速のご回答有難うございました。 > url = '/XXXX/' + YY の結果は '/XXXX/YY' でしょうか? はいそうです。urlの中身がそうなっている事も確認しました。 > 実際にはどこに行きたいのでしょう? 実際には、上記http://localhost:3000/XXXX/YYへ行きたいのです。 railsのログにも、 Redirected to http://localhost:3000/carts/43 と出ており、rails的には成功している様です。しかし、Fidderツールで該当のリクエストを 見ると、urlが自身コントローラ宛になっており、更にcontent-typeもtext/htmlが正しいですが text/planeになっています。この原因が分からないのです。
winterboum

2020/10/25 03:39

routs.rbを載せてください。 ただ、、、、 行きたいのが http://localhost:3000/carts/43 なのなら redirect_to cart_path(43) とか もっと良いのは redirect_to cart_path(@cart) なのですが。
yasushi-kibou

2020/10/25 03:45

ご回答有難うございました。機密もありますので、明らかに関係ないところは省き 最小限掲載します。 Rails.application.routes.draw do get 'collection/index' get 'outlet/index' get 'saleitem/index' get 'tips/index' resources :orders resources :line_items resources :carts resources :detail_quotes #メインメニュー root to: 'toiro#home' #TOPページ : ご指摘のredirect_toの他の書き方もやってみます。
winterboum

2020/10/25 03:52

resources :carts がありながら /carts/43 が 406 ということは id=43 な Cartが無いのでは? YY を出す所を確認を。 「リクエストのurlが/XXXX/YYではなく、自身のコントローラパスになっており、」 とは具体的には?
yasushi-kibou

2020/10/25 04:00

id=43なcartsは存在する事を確認しています。 redirect_toしているコントローラは、「detail_quotes」ですが、 Fidderの該当リクエスト行で、/detail_quotes となっています。
winterboum

2020/10/25 04:05

ありますか・・・・ 「Fidderの該当リクエスト行で、/detail_quotes」 というのは 406エラーが表示されている画面ですか?それともそのエラーを起こすactionがへのリクエストが書かれている画面ですか?
yasushi-kibou

2020/10/25 04:15

detail_quatesのコントローラメソッドで、DB登録成功した時、render_to ~/carts/43 しています。 なので後者という事でしょうか。 Fidderのエラー箇所は本来、url=/carts/43 、content-type=text/html となっているはずです。
winterboum

2020/10/25 05:10

はて、 後者でしたら redirest_to を書いてる action に向いているはずです。 「url=/carts/43 に向いているはず」なのに、は 406 を発行しているエラー画面なのでは? なら、その画面が text/plain なのかもしれません
winterboum

2020/10/25 05:11

redirec_to の action を載せることはできませんか?
yasushi-kibou

2020/10/25 05:50

これも抜粋ですが、DB登録成功後です。#は一通り試しました。 #binding.pry # format.any logger.debug("format.html 前") logger.debug(@cart) url = '/carts/' + @cart.id.to_s logger.debug(url) # redirect_to controller: :carts, action: :show, id: @cart.id byebug #binding.pry redirect_to url # format.html { redirect_to url, notice: 'カートに商品が追加されました。' } # format.json { render :show, status: :created, location: @detail_quote } # logger.debug("format.json 後")
winterboum

2020/10/25 06:36

url = '/carts/' + @cart.id.to_s でエラーが出ないのでしたら実在しますね。 次の2つ試してください 1) ブラウザーのURL欄に http://localhost:3000/carts/43 としてみる 2) redirect_to cart_path(@cart)
yasushi-kibou

2020/10/25 06:55

ご尽力感謝いたします。 1) エラー発生後、ログに出ている Redirected to http://localhost:3000/carts/50 からbrowserに張り付けたところ、 見事に遷移して欲しい画面に行きました。 2) こちらは、やはりこれまでと同様のエラーでした。 ここまでくると、railsの問題では、とまで疑いたくなりますが、その様な事象があまり聞かない ので、こちら固有の問題と思います。byebugというのを入れてみましたが、いま一つ有効かわかりません。javaですと、jdkや提供jarの中まで追えたりしましたが、他に何かデバッグ方法はないかと思います。
winterboum

2020/10/25 07:03

406ってのはかなり特殊なリターンなのです 一番最後の引用が役に立つかな https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89406 Not Acceptable 受理できない。Accept関連のヘッダに受理できない内容が含まれている場合に返される。 https://developer.mozilla.org/ja/docs/Web/HTTP/Status406 Not Acceptable このレスポンスは、ウェブサーバーが サーバー駆動型コンテンツネゴシエーション を行った結果、ユーザーエージェントから与えられた条件に合うコンテンツが見つからない場合に送信されます。 https://developer.mozilla.org/ja/docs/Web/HTTP/Status/406 HyperText Transfer Protocol (HTTP) の 406 Not Acceptable クライアントエラーレスポンスコードは、サーバーがリクエストの用意したコンテンツネゴシエーションヘッダーで定義された受付可能な値に一致するレスポンスを生成できず、サーバーが既定の表現方法で提供することを望まないことを表します。 用意されるコンテンツネゴシエーションヘッダーには次のものがあります。 Accept Accept-Charset Accept-Encoding Accept-Language 実際には、このエラーは滅多に使われません。このエラーコードが使用される代わりに、エンドユーザーには暗号的で修正するのが困難なものなので、サーバーは関連するヘッダーを無視してユーザーに実際のページを提供します。ユーザーが完全に利益にならない場合に限り、こちらのエラーコードを選択するでしょう。 サーバーがこのようなエラー状態を返してきた場合、メッセージの本文には利用できるリソースの表現の一覧を含み、ユーザーがその中から選択できるようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問