Fernando Fabreti
Fernando Fabreti

Reputation: 4366

ruby Mustache.render does not have 3rd parameter for partials like JS Mustache.render

I have a AJAX that send JSON to client, so it can render a Mustache template on the client side. The Mustache template has a partial. Everything goes fine. I'll borrow the example from here

Sample 11: Partials (JS Version of Mustache)

var data = { depts: [
    {   name: "Engineering",
        employees: [
            {firstName: "Christophe", lastName: "Coenraets"},
            {firstName: "John", lastName: "Smith"}]
    },
    {   name: "Sales",
        employees: [
            {firstName: "Paula", lastName: "Taylor"},
            {firstName: "Lisa", lastName: "Jones"}]
    }]
};

var tpl = "{{#depts}}<h1>{{name}}</h1>" +
          "<ul>{{#employees}}{{>employee}}{{/employees}}</ul>{{/depts}}";
var partials = {employee: "<li>{{firstName}} {{lastName}}</li>"};
var html = Mustache.render(tpl, data, partials);
$('#sampleArea').html(html);

As you can see in the call to Mustache.render, there is a 3rd argument that you can pass PARTIALS, works great in JS.

I need to do the exactly same thing in Ruby, but the problem is, in Ruby Mustache, the 3rd argument doesn't exist. I've seen the Mustache source and I've debugged it, it has something to do with the "context" of Mustache, but could not figure it out how to pass a PARTIAL like in the JS version of Mustache.

I've tried:

Mustache.render( mytemplate, { data: myjson, partial: mypartial })

but it doesn't render myjson

Upvotes: 0

Views: 498

Answers (1)

bobthecow
bobthecow

Reputation: 5117

In the Ruby implementation, partials are loaded from the filesystem by Mustache.partial, which, by default, checks for a file named mypartial.mustache in the current directory. You can override the default behavior by subclassing Mustache for your own specific needs:

class MyMustache < Mustache
  PARTIALS = {
    employee: "<li>{{firstName}} {{lastName}}</li>"
  }

  def partial(name)
    PARTIALS[name.to_sym]
  end
end

puts MyMustache.render(tpl, data)

The Ruby implementation is remarkably well documented, but mostly in the source comments. Check it out for more info :)

Source

Upvotes: 2

Related Questions