我想使用 Diesel 显示从数据库中检索到的值,并使用带有 Rocket 的 Tera 模板将其作为 HTML 提供:
#[get("/")]
fn index(db: DB) -> Template {
use mlib::schema::users::dsl::*;
let query = users.first::<User>(db.conn()).expect("Error loading users");
let serialized = serde_json::to_string(&query).unwrap();
println!("query = {:?}", &serialized);
Template::render("index", &serialized)
}
它在 src/的
并尝试使用模板呈现它。它看起来不错,但返回此错误:#[get("/")]
中从数据库接收 User { id: 1, name: "yamada"}
main.rs
Error: Error rendering Tera template 'index': Failed to value_render 'index.html.tera': context isn't an object
最佳答案
错误信息告诉你所有你需要知道的:
context isn't an object
什么是context
?查看 Template::render
的文档:
fn render<S, T>(name: S, context: &T) -> Template
where S: AsRef<str>,
T: Serialize,
这MCVE显示问题:
src/main.rs
#![feature(plugin)]
#![plugin(rocket_codegen)]
extern crate rocket;
extern crate rocket_contrib;
use rocket_contrib::Template;
#[get("/")]
fn index() -> Template {
let serialized = "hello".to_string();
Template::render("index", &serialized)
}
fn main() {
rocket::ignite().mount("/", routes![index]).launch();
}
Cargo.toml
[dependencies]
rocket = "0.1.6"
rocket_codegen = "0.1.6"
[dependencies.rocket_contrib]
version = "0.1.6"
features = ['tera_templates']
templates/index.html.tera
<html />
大多数模板引擎都针对将名称映射到值的数据结构工作。在许多情况下,这与 HashMap
一样简单,但 Rocket 允许您传入任何可以序列化的内容。这旨在允许传入一个结构,但它也允许您传入不将名称映射到值的东西,例如纯字符串。
你有两个选择:
- 创建值的
HashMap
(或者可能是BTreeMap
)。 - 为结构实现
序列化
并将其传入。
这是第一个选项:
use std::collections::HashMap;
let mut serialized = HashMap::new();
serialized.insert("greeting", "hello");
Template::render("index", &serialized)
关于rust - 如何使用 Rocket 中的 Tera 模板在 HTML 中显示使用 Diesel 检索的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42063537/