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

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

ただいまの
回答率

90.34%

  • Ruby on Rails

    7666questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 526

pebble8888

score 370

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以外なら問題ないのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 19:37

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

    キャンセル

  • 2017/02/22 19:42

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

    キャンセル

  • 2017/02/22 20:07

    なるほど、相談してみます。
    私の乏しい知識から想像するに、サーバの状態を変化させない操作なのでGETなのかも知れません。

    交渉には時間がかかりそうなので、とりあえず他の部分のテストを進めるため、
    railsのcontrollerで取得する方法をご存知なら教えて頂きたいです。
    「phpなら簡単にできるよ」ということであればphpで作ります。。

    キャンセル

  • 2017/02/22 20:19

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

    キャンセル

  • 2017/02/25 12:40

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    7666questions

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