diff --git a/src/context.rs b/src/context.rs index 06c0598c3..10e15fd90 100644 --- a/src/context.rs +++ b/src/context.rs @@ -78,19 +78,20 @@ fn parse_json_visitor<'a, 'reg>( } None => { if path_context_depth > 0 { - if let Some(ref context_base_path) = block_contexts + let blk = block_contexts .get(path_context_depth as usize) - .map(|blk| blk.base_path()) - { - extend(&mut path_stack, context_base_path); + .or_else(|| block_contexts.front()); + + if let Some(base_value) = blk.and_then(|blk| blk.base_value()) { + merge_json_path(&mut path_stack, relative_path); + ResolvedPath::LocalValue(path_stack, base_value) } else { - // TODO: is this correct behaviour? - if let Some(ref base_path) = block_contexts.front().map(|blk| blk.base_path()) { + if let Some(base_path) = blk.map(|blk| blk.base_path()) { extend(&mut path_stack, base_path); } + merge_json_path(&mut path_stack, relative_path); + ResolvedPath::AbsolutePath(path_stack) } - merge_json_path(&mut path_stack, relative_path); - ResolvedPath::AbsolutePath(path_stack) } else if from_root { merge_json_path(&mut path_stack, relative_path); ResolvedPath::AbsolutePath(path_stack) diff --git a/src/partial.rs b/src/partial.rs index 207e8f520..f89e41445 100644 --- a/src/partial.rs +++ b/src/partial.rs @@ -293,4 +293,21 @@ mod test { let page = handlebars.render_template(&template3, &json!({})).unwrap(); assert_eq!("Hello", page); } + + #[test] + fn test_up_to_partial_level() { + let outer = r#"{{>inner name="fruit:" vegetables=fruits}}"#; + let inner = "{{#each vegetables}}{{../name}} {{this}},{{/each}}"; + + let data = json!({ "fruits": ["carrot", "tomato"] }); + + let mut handlebars = Registry::new(); + handlebars.register_template_string("outer", outer).unwrap(); + handlebars.register_template_string("inner", inner).unwrap(); + + assert_eq!( + handlebars.render("outer", &data).unwrap(), + "fruit: carrot,fruit: tomato," + ); + } }