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

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

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

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

Q&A

解決済

1回答

2229閲覧

rails GETのクエリパラメータにjsonstringを設定した時のcontrollerでの取得の仕方

pebble8888

総合スコア390

Ruby on Rails

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

0グッド

0クリップ

投稿2017/02/22 09:41

rails GETのクエリパラメータにjsonstringを設定した時に、controllerで内容を取得するにはどうすればよいでしょうか?

ログ上は次のように出力されます。

Started GET "/hoge?{"fuga":[{"foo":"A"}]}" for ::1 at 2017-XX-XX XX:XX:XX +0900 Processing by HogeController#index as */* parameters: {"{\"fuga\":"=>{"{\"foo\":\"A\"}"=>{"}"=>nil}}, "hoge"=>{}} Completed 200 OK in 1ms (Views: 0.3ms | ActiveRecord: 0.9ms)

ここで1行目の最初と最後の"以外の{}":[]の文字は実際にはPercentEncodingされたものですが、
分かりやすく実際のキャラクターで書きました。
送るときもPercentEncodingして送っています。
なお、関係ないと思いますが、送信側アプリはswiftで作ったものです。

Content-Typeにはapplication/jsonを指定しています。

railsのバージョンは5.0.1です。

h_hash = JSON.parse(params) p h_hash

とすると、
TypeError (no implicit conversion of ActionController::Parameters into String):
のエラーとなります。

pp = params[:fuga] pp.present?

の結果はfalseでした。

GETのクエリパラメータにjsonをstringifyしたものを渡すサンプルがネット上にあまり見当たりませんでした。

この設計はrailsではあまりよろしくないということなのでしょうか?
rails以外なら問題ないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜGETなんでしょうか。POST使ったほうがいいと思いますが。クエリパラメーターにした場合エスケープしなきゃならなくなりめんどいと思いますが。

投稿2017/02/22 09:44

turbgraphics200

総合スコア4267

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

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

pebble8888

2017/02/22 10:37

回答ありがとうございます。 なぜGETなのかは分かりません。 API設計をしたのは私ではないのです。 API実装も多分railsではないのですが、クライアントのテスト用にモックを自分で作りたいので、できれば慣れているrailsでやりたいという事情です。 POSTに変更してくれと押してもよいものでしょうか?
turbgraphics200

2017/02/22 10:42

GETでなければいけないという理由が取り立ててないのであれば、押すべきだと思いますが。
pebble8888

2017/02/22 11:07

なるほど、相談してみます。 私の乏しい知識から想像するに、サーバの状態を変化させない操作なのでGETなのかも知れません。 交渉には時間がかかりそうなので、とりあえず他の部分のテストを進めるため、 railsのcontrollerで取得する方法をご存知なら教えて頂きたいです。 「phpなら簡単にできるよ」ということであればphpで作ります。。
turbgraphics200

2017/02/22 11:19

例として/test?hoge=fugaをGETリクエストした場合 RailsではGETはデフォルトのルーティングを使用すると、indexメソッドとなるため def index hoge params[:hoge] end とparams[:パラメーターキー]とすれば取得できます。 PHPの場合だとフレームワークによりルーティングが変わってくるでしょうからフレームワークを使用しない場合は、 $_GET['hoge']で取得できるかと(フレームワークも元はここから取得されますが) どっちが簡単かといえば個人下がるでしょうが私はPHPのほうが楽かと思いますが。
pebble8888

2017/02/25 03:40

とりあえず仕様検討を依頼してみました。querystringにjson文字列を無理やり設定していたのは間違っていた気がします。またswiftのURLRequestクラスにPOST以外をセットしてhttpBodyにデータをセットすると送信できないようです。アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問