AR.to_json はコンソールでは動作しますが、ブラウザでは失敗します
-
03-07-2019 - |
質問
このコードブロックがあります:
users = Array.new
users << User.find(:all, :conditions => ["email like ?", "%foo%"])
users << User.find(:all, :conditions => ["name like ?", "%bar%"])
users.flatten!
users.uniq!
puts users.to_json :include => [:licenses]
スクリプト/コンソールを使用して実行すると、おそらく想像されるとおりのものが返されます。これは、私が見つけて平坦化され、一意化されたユーザーの配列の JSON 表現です。ただし、同じコード行を search_for_users
メソッドを実行すると、このエラーが発生します
ControllerName#search_for_users の TypeError
引数の型が間違っています ハッシュ (予期されるデータ)
参照される行は .to_json 呼び出しを含む行です。
コードが文字通り同じなので、困惑しています。唯一の違いは、コンソールで実行しているときは条件を手動で入力していますが、私のメソッドではクエリを取得していることです。 params[:query]
. 。ただし、クエリをハードコーディングしようとしただけで同じ結果が得られたため、それが問題ではないと思います。を削除すると、 :include
, エラーは表示されませんが、必要なデータも取得できません。
問題が何であるかわかる人はいますか?
解決
コントローラーに含まれている場合、.to_json が失敗する原因となる可能性のあるプラグインや gem がいくつかあります。Twitter の逸品もそのうちの 1 つだと思います (少し前にこれに関する問題に遭遇しました)。
このコントローラーに「[何か] を含める」または「[何か] を要求する」がありますか?
そうでない場合は、トラブルシューティングなどに使用しているプラグインを一時的に削除することをお勧めします。
最後に、コントローラーのアクション全体を次のように置き換えるとどうなるでしょうか。%w(1 2 3 4 5).to_json
これは、何が失敗しているのかを特定するのに役立つはずです。
他のヒント
テストまたはコンソールのコードが本番環境とは異なる動作をする場合(推測...サイトを開発モードで実行している可能性があります)、これは読み込み順序の問題を引き起こします。実稼働環境では、すべてのモデルとコントローラーが事前にロードされますが、他の環境では必要に応じて遅延ロードされます。
RAILS_ENV = production ./script/console
を使用してコンソールを起動し、この方法でエラーを再現できるかどうかを確認します。
cscottaが述べたように、いくつかのgemとライブラリがあり、それらは.jjを必要とするときに取得する機能について言及するために、最初に.to_jsonに干渉する可能性があります。私は個人的にそれに関していくつかの問題に遭遇しました。
これが役立つことを願って
セブ