Sending object as a variable to Mandrill via Rails

2019-08-30 09:18发布

问题:

I'm converting an email template from Rails to Mandrill, the content for which requires a fair amount of data, some of which is nested through several associations.

Therefore, I'd like to pass objects via Mandrill's global_merge_vars, such as the (simplified) following:

[{ 'name'=>'order', 'content'=> @order.to_json(include:
                                                { user: { only: :first_name } },
                                                  methods: [:method1,
                                                            :method2,
                                                            :method3,
                                                            :method4])
}]

Which passes through to the mandrill template under the order variable similar to the following:

{"id":11,"number":"xxxx","item_total":"112.0"...
 "user":{"first_name":"Steve"},"method1":"£0.00","method2":"£112.00",
 "method3":"£112.00","method4":"£0.00"}

The problem is, I can't access anything within order (using Handlebars), i.e. {{order.id}}, {{order['id']}} etc. wont work.

It's not an option to break out data into a large number of variables, as some elements are collections and their associations.

I believe the problem occurs as everything is stringified when the variables are compiled for Mandrill -- therefore breaking the JSON object -- with the following a snippet of what is sent across:

"global_merge_vars"=>[{"name"=>"order", "content"=>"{\"id\":11,
\"number\":\"xxxx\",\"item_total\":\"112.0\"...

I can't seem to find any documentation / suggestions for dealing with this, so am wondering whether this it's possible to pass data of this nature, and, if so, how to correctly pass it to be able to access the objects in the Mandrill template. Any advice greatly appreciated!

Steve.

回答1:

try this:

[{ 'name'=>'order', 'content'=> JSON.parse(@order.to_json(include:
                                            { user: { only: :first_name } },
                                              methods: [:method1,
                                                        :method2,
                                                        :method3,
                                                        :method4]))
}]