• ベストアンサー

Rails4でJSONのParseErrorを判定

Ruby on Rails 4 で Rest 形式で Web API の開発しています。 クライアントからくる Request の JSON に構文エラーがあるか判定したいのですが 構文エラーがあると  ActionDispatch::ParamsParser::ParseError 上記のエラーが、コントローラに来る前に発生してしまうので、エラーの判定ができません。 どうすればプログラム上で上記のエラーが起こったか判定することができるでしょうか?

  • Ruby
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hirotn
  • ベストアンサー率59% (147/246)
回答No.2

申し訳ありません。 #1は、呼び出し関係がわからなかったので、構文チェックをするメソッドを提供すればいかがでしょうか、という提案をさせていただいたものです。JSONファイルを指定する前に構文チェックをして、OKのものだけ指定する。ということをイメージしておりました。 (話変わりまして、) 以下のURLが該当しそうです。 https://gist.github.com/elarkin/4709748

OkamotoT
質問者

お礼

回答ありがとうございます。 ttp://stackoverflow.com/questions/15459143/how-to-rescue-from-actiondispatchparamsparserparseerror-in-rails-4 上記にも答えが書いてあったのですが、 Rack middleware の仕組みを理解していなかったので、 ソースをどこに配置すればいいかなど全然わからず苦労しましたが、 どうにか理解して配置し、rescue できるようになりました。 ありがとうございます。

その他の回答 (1)

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.1

http://minamirb.github.io/rails_beginners_lesson/upgrading-from3.2-to4.0/ Rails 4.0 では、ParamsParser がリクエストパラメータのパースに失敗した場合に、ActionDispatch::ParamsParser::ParseError を継承した例外があがります。より下位の、例えば MultiJson::DecodeError の代わりに、この例外を rescue してもよいです。 だそうなので、以下のURLを参考にしてParseErrorもrescueする形にして、構文チェック用のメソッドを提供するのはどうでしょうか。 https://www.ruby-forum.com/topic/136579

OkamotoT
質問者

補足

回答ありがとうございます。 ですが、上記のURLを確認したのですが、 parse を明示的にやっているようですが、 どこに設定すればいいのでしょうか? 現状ではHTTP の通信が届くと、最初にURLのアクションに指定したコントローラの関数が実行されていますが、 コントローラより前に処理を実行するには、どこに記述すればよいのでしょうか?

関連するQ&A

  • Rails のログの */* はどういう意味?

    Rails 4 で Web API を開発しています。 JSON のフォーマットのみを許した機能があるのですが、 クライアント側から JSON と指定しなくても接続できてしまうという指摘があったので、 ログを見てみたところ、指摘された接続の箇所に Processing ○○Controller#○○Action as */* と、フォーマットを表す部分が、JSON でも HTML でも XML でもなく、 */* という記号になっておりました。 HTML を指定すると レスポンスを返す処理で UnknownFormat エラーが出るのですが、 */* となっている接続はエラーも出ず JSON の接続と同じように処理されます。 この */* というフォーマットは何を意味しているのでしょうか? 検索しようにも記号の検索はできないので、全く情報が見つからず困っています。

    • ベストアンサー
    • Ruby
  • RailsでJSONを使用して画面作成

    環境はRuby1.9.2、Rails3.1です。 Webアプリを作る勉強をしているのですが、 JSONを返してそのデータを利用して画面を作成しようと思っています。 Rails側はDBから取得したデータをto_jsonでJSON形式に変換して respond_toで返してあげればいいんですよね? UI側はこのデータを利用して構築するにはDOMでがりがり組むしかないんでしょうか? イメージがいまいちつかめません…… 参考になる書籍やサイト等もしご存知であれば教えてください。 これはRubyというよりjavascriptのカテゴリになるんでしょうか。 もしそうであるなら申し訳ありません。 よろしくおねがいします。

    • ベストアンサー
    • Ruby
  • railsについて

    railsについて ruby on railsについて質問なんですが、 routes.rbってMVCとの対応で言えばどんな感じなんでしょうか? routesで指定したルートはコントローラとメソッドを指定していますが どの.html.erbを使うかの指定はどこでされてるんですか?

    • ベストアンサー
    • Ruby
  • Rails4 Redirect_Toで送信

    Rails4の開発で困っています。 コントローラーのRedirect_ToからほかのサーバへダイレクトにURLを記載し、そのURLの後ろに、?からJSON形式データをつけて渡そうとしています。 一度実施してみると、Webrickのログでは、URLを生成できていますが、 ERROR URI::InvalidURIError: bad URI(is not URI?) というエラーが出て送信できません。 redirect_toを利用することにこだわりはありません。 jsonデータをコントローラーで生成して、そのあと、決まったURLにつけて送信するだけです。 何か良い方法はないでしょうか?

    • ベストアンサー
    • Ruby
  • railsでのデータベースエラー

    Ruby on rails を最近はじめました! MySQLをDBとしたところ、 Action Controllerでエラーが発生してしまいました! #28000Access denied for user 'root'@'localhost' (using password: NO) とはどういうことなのでしょうか?? アドバイスよろしくお願いします!! ※WindowsVista + MySQL + rails

  • Ruby on Railsを学ぶにあたっての書籍について

    最近流行のRuby on Railsですが、手始めに「RailsによるアジャイルWebアプリケーション開発」を購入しました。 もうすこし、ステップバイ・ステップで理解できるものやチュートリアル的な書籍でお勧めがありましたら教えていただけませんでしょうか?

  • Rails 3 での動的更新について

    Ruby on Rails 3 を利用してウェブ開発をしているのですが、Rails 2 の時に利用できた動的更新が出来なくて困っています。 今回の質問の動的更新とは、テキストフィールドなどに入力があるとそれを検知して、コントローラー内の処理を呼び出して結果をページの一部として表示する、というものです。 Rails 2 の時には以下のようにしていました。 <script language="JavaScript"> <!-- function ShowRule() { $("#show_value").load("/[コントローラー名]/[メソッド名]?[パラメーター]="+document.[フォーム名].[ポスト名].value); } //--> </script> 値を返したい部分に <div id="show_value"></div> を置き、入力を監視したい項目に :onclick => "ShowRule()" のオプションをつけていました。 同じように記述したのですが、Rails 3(というか jquery)だと上手く動きません。上記のような処理を jquery で行う方法をご教授ください。 よろしくお願い致します。

  • MacでRailsアプリを開発する際のエディタ

    MacでRuby on Railsのソフトを開発するのに向いているエディタを探しています。 現在はAptanaを使っているのですが、もう少し単語の補完機能が充実している物はありますでしょうか?

    • ベストアンサー
    • Ruby
  • ruby on railsで開発するときのエディタ

    初めまし.て。 今度新しく入社する会社で、ruby on railsを使用した開発を致します。 そこで、現場ではなんというエディタを使うのが一般的なのでしょうか。 私は今まで、サクラエディタと秀丸くらいしか使ったことがありません。 入社前までにエディタの使い方くらいは覚えておきたいので、 railsを会社で使用している方、いらっしゃいましたら、ご回答お願いいたします。

  • Rails3でのクリックされたボタンの判定について

    現在Rails3でWEBアプリの開発をしているのですが 実現方法が不明な事が有るので質問させて頂きました。 実行環境は   OS:Windows7   Railsバージョン:3.0.9   APサーバー:WEBrick です。 実現方法が不明なのは、一つのフォームに複数のサブミットボタンを配置し コントローラーでどのボタンが押されたのか判定する方法です。 ビューにおいてフォーム内に  <%= submit_tag 'OK', {:disable_with => "Sending…"} %>  <%= submit_tag 'CANCEL', {:disable_with => "Sending…"} %> と言う様にサブミットボタンを配置し コントローラーでどちらのボタンが押されたのかを判定する方法なのですが 検索して調べてみると  if 'OK' == params[:commit] then   OKボタンが押された際の処理  else   CANCELボタンが押された際の処理  end と言う風に出来ると言う情報を見つけたのですが、実際にやってみると 上記の様な値はparamsから取得出来ないので、正しく動作しません。 paramsで取得した値の中身を見ても、それらしい値も無く 何を判断すればどのボタンが押されたのかを判断出来るのかが判らず 非常に困っております。 サブミットボタンにjavascriptのコードを埋め込み 送信前にHIDDEN項目にクリックされたボタンを表す値を埋め込むと言った方法で 回避する事も可能かとは思いますが、標準的なやり方とも思えず また、良く行われる処理だと思いますので、他に方法が有る様に思えます。 どなたかご存知の方が居れば御回答お願いします。

    • ベストアンサー
    • Ruby