sunng87 / handlebars-iron

Handlebars middleware for Iron web framework
MIT License
119 stars 20 forks source link

no method named `register_helper` found #52

Closed mrLSD closed 7 years ago

mrLSD commented 7 years ago

I try registering Helper

#![allow(dead_code)]
use hbs::{HandlebarsEngine, DirectorySource};
use handlebars::{Handlebars, RenderError, RenderContext, Helper, Context};

pub fn template_render(paths: Vec<&str>) -> HandlebarsEngine {
    let mut template = HandlebarsEngine::new();

    // Add helpers
    template.register_helper("link", Box::new(link_helper));

    // add a directory source, all files with .html suffix
    // will be loaded as template
    for path in paths.iter() {
        template.add(Box::new(DirectorySource::new(path, ".html")));
    }

    // load templates from all registered sources
    if let Err(r) = template.reload() {
        panic!("{}", r);
    }
    template
}

And I got error:

error: no method named `register_helper` found for type `hbs::HandlebarsEngine` in the current scope
  --> src/middleware/render.rs:11:14
   |
11 |     tempalte.register_helper("link", Box::new(link_helper));
   |              ^^^^^^^^^^^^^^^

error: aborting due to previous error

How to fix that?

sunng87 commented 7 years ago

To use custom helpers in handlebars template middleware, you create a HandlebarsEngine from custom Handlebars registry. Code example:

extern crate handlebars;
extern crate handlebars_iron;

use handlebars::Handlebars;
use handlebars_iron::HandlebarsEngine;

...

let hregistry = Handlebars::new();
hregistry.register_helper("helper_name", ...)

let hengine = HandlebarsEngine::from(hregistry);
...
mrLSD commented 7 years ago

That's it!

I think exactly (let mut): let mut hregistry = Handlebars::new();

Maybe a good idea adding your example to hbs-iron docs.

sunng87 commented 7 years ago

Will do that, thank you!