Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON Decode Parameter Issue

I have a rails 4 application that uses postgresql. I also have a backbone.js application that pushes JSON to the rails 4 app.

Here's my controller:

def create
 @product = Product.new(ActiveSupport::JSON.decode product_params)

 respond_to do |format|
  if @product.save
    format.json { render action: 'show', status: :created, location: @product }
  else
    format.json { render json: @product.errors, status: :unprocessable_entity }
  end
 end
end
def product_params
  params.require(:product).permit(:title, :data)
end

I'm trying to parse the JSON and insert the product, but on insert, I'm getting the error:

TypeError (no implicit conversion of ActionController::Parameters into String):

Thanks for all help!

like image 773
the_ Avatar asked Apr 16 '14 01:04

the_


People also ask

Why is json_decode returning null?

If json_decode returns null is it because the database. json is not valid. You can fix this by open the database.

How can you decode JSON string?

You just have to use json_decode() function to convert JSON objects to the appropriate PHP data type. Example: By default the json_decode() function returns an object. You can optionally specify a second parameter that accepts a boolean value. When it is set as “true”, JSON objects are decoded into associative arrays.

What happens if JSON parse fails?

Copied! We call the JSON. parse method inside of a try/catch block. If passed an invalid JSON value, the method will throw an error, which will get passed to the catch() function.

How does JSON decode work?

The json_decode() function can return a value encoded in JSON in appropriate PHP type. The values true, false, and null is returned as TRUE, FALSE, and NULL respectively. The NULL is returned if JSON can't be decoded or if the encoded data is deeper than the recursion limit.


2 Answers

Your mileage may vary, but I fixed a smilar problem by a bandaid code like this:

hash = product_params
hash = JSON.parse(hash) if hash.is_a?(String)
@product = Product.new(hash)

The particular problem I had was that if I was just doing JSON.parse on the params that contained the object I wanted to create, I was getting this error while unit testing, but the code was working just fine when my web forms were submitting the data. Eventually, after losing 1 hour on logging all sorts of stupid things, I realized that my unit tests were somehow passing the request parameter in a "pure" form -- namely, the object was a Hash already, but when my webforms (or manual headless testing via cURL) did sumbit the data, the params were as you expect -- a string representation of a hash.

Using this small code snippet above is, of course, a bandaid, but it delivers.

Hope that helps.

like image 148
dimitarvp Avatar answered Oct 14 '22 16:10

dimitarvp


Convert hash into JSON using to_json

like image 3
Praveen Venkatapuram Avatar answered Oct 14 '22 16:10

Praveen Venkatapuram