Forum: Ruby json variable passing

15e7770737e26d7094f3c77d76b2dbe0?d=identicon&s=25 mark edwards (edwardsmarkf)
on 2013-11-12 19:45
hello all (ruby newbie) -

i have been using PHP for some time now to take a big complicated data
structure and pass it right into jScript using something like the
following:

const Foo=JSON.parse('<?php echo addslashes(json_encode($Foo)); ?>');
--or a shorter version--
const Foo=JSON.parse('<?=addslashes(json_encode($Foo))?>');

for the non-php types, all this is really doing is to take any
structure, make it json friendly, and then include it as a jScript
constant variable.

so, i can run some big mysql statement, put the results into a php
array-variable, and make the results available to a jScript constant.

is there a simple way in ruby to do the same thing?

i am looking for a one-liner to move massive amounts of data.

from what little i have seen with ruby, there seems to be virtually
nothing it cant do better than php.
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-13 00:20
(Received via mailing list)
On Nov 12, 2013, at 12:45 PM, mark edwards <lists@ruby-forum.com> wrote:

> for the non-php types, all this is really doing is to take any
> from what little i have seen with ruby, there seems to be virtually
> nothing it cant do better than php.
>
>

Oh yes.

Lets assume a similar setup, where you want to fill in a javascript data
structure with JSON supplied on the server before you send it down to
the client.

Using the standard ERB stuff:

const Foo = <%= big_extraction_of_data.to_json %>

the big_extraction_of_data could be something that returns or contains
an Array or Hash object, or possibly an ActiveRecord Relation or any
other type of class that implements the .to_json message.

Im not sure you need the JSON.parse('stringified json') there even in
the php case, do you? it should just basically imprint json directly
into the page at that point.
15e7770737e26d7094f3c77d76b2dbe0?d=identicon&s=25 mark edwards (edwardsmarkf)
on 2013-11-13 02:03
tamouse - thank you very much for taking the time to answer my question.
it looks even simpler and cleaner in ruby !

we needed the jScript command "JSON.parse" because of quotes being
passed and other characters inside the json-string that might interfere
with the string loading properly.

i am thinking something like this might work:

const Foo = JSON.parse("<%= big_extraction_of_data.to_json %>");

side-note:  i find it extremely useful to create a monster structure and
just pass it down to jScript as is, and let jScript (or jQuery) do all
the work.  i have been able to collapse the size of pages this way quite
dramatically, assuming my user will probably never need to see all the
data at the same time.

i have my users click on a link, then the html is auto-generated via
jQuery and that code is used in a pop-up window.  the overall page size
is probably only 10% of what it takes when all the html is generated
from the server.
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-13 05:11
(Received via mailing list)
On Nov 12, 2013, at 7:03 PM, mark edwards <lists@ruby-forum.com> wrote:

> tamouse - thank you very much for taking the time to answer my question.
> it looks even simpler and cleaner in ruby !
>
> we needed the jScript command "JSON.parse" because of quotes being
> passed and other characters inside the json-string that might interfere
> with the string loading properly.

But in this case, the JSON object data is right in the code, no need to
quote it, then parse it client side if you just write it directly into
the source youre sending.

Heres a tiny example, based on sinatra:

  get '/testjson' do ||
    erb :testjson, locals: {this_hash: {a: [1,2,3], "BBB" => "Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enimad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.", "classic" => ["a fine thing", "I do now",
"blueberry", :pudding, 3.1415]}}
  end


Then the erb view testjson.erb contains:

<h1>Testing sending JSON directly</h1>

<script>
const Foo = <%= this_hash.to_json %>;
console.log(Foo);
</script>

and this is the source html in the browser:


<h1>Testing sending JSON directly</h1>

<script>
const Foo = {"a":[1,2,3],"BBB":"Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
magna aliqua. Ut enimad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa
qui officia deserunt mollit anim id est laborum.","classic":["a fine
thing","I do now","blueberry","pudding",3.1415]};
console.log(Foo);
</script>

So, no extra quoting, parsing, etc.


>
Putting it in a string, then parsing it just seems like extra work. Just
insert the JSON object in directly, and assign it.

> i have my users click on a link, then the html is auto-generated via
> jQuery and that code is used in a pop-up window.  the overall page size
> is probably only 10% of what it takes when all the html is generated
> from the server.

Its certainly valid for a lot of interactions.
15e7770737e26d7094f3c77d76b2dbe0?d=identicon&s=25 mark edwards (edwardsmarkf)
on 2013-11-13 17:26
tamouse - once again, thank you for your time and your patience with
newbies!

where i ran into trouble was passing a string like this:

This ruby string contains double "quote" characters and single 'quote'
characters

using php, jScript was getting very confused with the quoting.  its like
all double-quotes needed to be back-slashed, changed to %22,  or
something like that.   but i will give this a try in ruby using your
approach.

assuming this works, you will put a huge smile on my face!
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-14 05:16
(Received via mailing list)
On Nov 13, 2013, at 10:26 AM, mark edwards <lists@ruby-forum.com> wrote:

> something like that.   but i will give this a try in ruby using your
> approach.
>
> assuming this works, you will put a huge smile on my face!

I think even in your PHP case, you were unnecessarily putting the JSON
in a string and parsing it on the client side.

To keep the ruby list pure, Ive shuffled off a PHP version to this gist:
https://gist.github.com/tamouse/7461180
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.