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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1630閲覧

Railsのルーティングで日本語文字をパラメータとして渡したい

kotarofunyu

総合スコア23

Ruby on Rails 5

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/02/12 14:07

概要

フロントのjsからバックのRails APIを叩いて、データを取得しようと試みています。
この場合、パラメーターとなる名前(日本語)がパーセントにエンコードされるので、Rails側でパラメーターとなる”パフェ”を受け取ることができなく、以下のエラーが出ます。

No route matches [GET] "/api/food/%E3%83%99%E3%83%B3%E3%83%81%E3%83%97%E3%83%AC%E3%82%B9"

javascript

1axios.get("/api/food/パフェ")

Ruby

1#routes.rb 2namespace :api, format: 'json' do 3 get '/food/:name' => 'food#item' 4end

Ruby

1#food.controller 2def item 3 @item = Food.find_by(name: params[:name]) 4end

自分で捻り出した解決方法

  1. rails側でパーセントをデコードして受け取る→やり方がわからないし、前段階でルーティングエラーになる
  2. axiosでリクエスト投げる時に、エンコードさせない→無理

全く方法が浮かびません...。
ご教授いただけますでしょうか...!よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際にやっていただいているのでおわかりだと思うのですが、ルーティングで日本語を含めないほうがいいと思います。

一つのやり方として、パラメータとなる値はurlのクエリパラメータとして渡す方法があります。

「クエリパラメータ」というのは、http://gaforum.jp/?s=gaiqのように、URLの末尾に?s=gaiqのようにサーバーにわたしたいパラメータを付け加える情報です。
この値はサーバー側で取得できるので、今回のように検索したい文字列などを渡すときに便利です。

axiosであれば、このように書くとクエリパラメータを指定できます。
axiosのパラメータ指定方法まとめ - Qiita

js

1axios.get('/api/food?name=パフェ');

Railsでは、ルーティングからnameを削除して、

ruby

1# routes.rb 2namespace :api, format: 'json' do 3 get '/food' => 'food#item' 4end

コントローラーでは今まで通りparams[:name]で取得できます。
Rails APIのURLにクエリパラメータを含める:KeruuWeb

ruby

1# foods_controller.rb 2 3def item 4 @item = Food.find_by(name: params[:name]) 5end

投稿2020/02/13 11:54

編集2020/02/13 11:55
shgtkshruch

総合スコア665

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

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

kotarofunyu

2020/02/13 12:42

shgktshruch様 できました!! こんなにご丁寧な回答をいただけて、おまけに解決もできて、大変嬉しいです! 本当にありがとうございます
shgtkshruch

2020/02/13 13:13

解決できてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問