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

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

ただいまの
回答率

90.53%

  • Ruby on Rails

    7237questions

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

  • API

    1518questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • JSON

    1146questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Cisco

    92questions

    シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

RailsでTypeErrorの原因がわかりません

解決済

回答 2

投稿 編集

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

kozica

score 26

railsを起動しcisco merakiのダッシュボードからScanning APIのPOSTs URLを追加しようとURLを入れてrails側にGETリクエストを送り、それに対しRailsがValidatorの値をPOSTで返したところ、下記のエラーメッセージが出てきました。

Started POST "/personal_logs" for 127.0.0.1 at 2018-07-26 12:03:23 +0900
Processing by PersonalLogsController#presenceapi as HTML
  Parameters: {"version"=>"2.0", "secret"=>""...
.
.
}, "seenTime"=>"2018-07-26T03:02:38Z", "ssid"=>nil, "os"=>nil, "clientMac"=>"20:ab:37:", "seenEpoch"=>15325158, "rssi"=>9, "ipv6"=>nil, "manufacturer"=>"Apple"}]}}}
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.0ms)

TypeError (no implicit conversion of ActionController::Parameters into String):  
app/controllers/personal_logs_controller.rb:12:in `presenceapi'

app/controllers/personal_logs_controller.rbの

map = JSON.parse(params[:data]).with_indifferent_access


ここ周辺に原因があるようですが、どうアプローチしていいかわかりません。
下記に該当コードを載せておきます

本当に困ってるのでどうかお力を貸して頂きたいです

#app/controllers/personal_logs_controller
MERAKI_VALIDATOR='xxxxxxxxxxxxxxxxxxxxxxxxxx'
MERAKI_SECRET = 'xxxxxxxx'

class PersonalLogsController < ApplicationController
  skip_before_action :verify_authenticity_token
  before_action :set_personal_log, only: [:show, :edit, :update, :destroy]

  def presenceapi
    if request.post?
      map = JSON.parse(params[:data]).with_indifferent_access
      if map[:secret] == MERAKI_SECRET
        map[:probing].each do |p|
          Presence.create(ap_mac: p[:ap_mac], client_mac: p[:client_mac],
                          last_seen: DateTime.parse(p[:last_seen]),
                          rssi: p[:rssi])
        end
        render :text => '' and return
      else
        Rails::logger.warn("*** MERAKI req with bad secret '#{map[:secret]}'")
        rails 'access denied'
      end
    else
      render :plain => MERAKI_VALIDATOR
    end
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

 どうアプローチするか

development環境かつ非daemon(ようはrails sで起動してctrl+cで終了させる環境)
ならば
送ってくるデータを再現できる環境を作成して
binding.irbやbinding.pry
web-console
等でデバッグする

 なぜTypeErrorが出るか

railsのバージョンの関係かしらんけどjsonが勝手に似非Hashに読み取られてるっぽい
map = params[:data]
map = params
どっちかはできるような気がする。

後はmap = JSON.parse(request.body.read)ができるかも

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/27 10:25

    丁寧にありがとうございます。
    ただ、当方が初心者すぎて具体的にどうすればいいのかよくわかりません
    自分なりに調べてやりますが、できれば具体的な作業内容を記述して頂けると嬉しいです。

    キャンセル

0

原因としては、「application/jsonを送りつけたときに、Railsが勝手にJSONをparseしてしまう」という感じですね。

こちらのリンクに解説されています。> 公式の説明

というわけで自力でJSON.parseは不要で、
単にparams[:data][:secret]などのように、アクセス可能なのではないでしょうか。

(リンク先で言及されている、wrap_parameters の挙動に注意してください。)

もしこういったRails独自の制御を嫌うのであれば、
他の方が書かれている、JSON.parse(request.body.read) で目的は達成できそうです。(が、Railsを使うならRailに乗ったほうが良いとは思います)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Ruby on Rails

    7237questions

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

  • API

    1518questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • JSON

    1146questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Cisco

    92questions

    シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品