rust - 如何使用 Rocket 中的 Tera 模板在 HTML 中显示使用 Diesel 检索的值?

标签 rust rust-diesel rust-rocket tera

我想使用 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)
}

The full sample code is here

它在 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 允许您传入任何可以序列化的内容。这旨在允许传入一个结构,但它也允许您传入不将名称映射到值的东西,例如纯字符串。

你有两个选择:

  1. 创建值的 HashMap(或者可能是 BTreeMap)。
  2. 为结构实现序列化并将其传入。

这是第一个选项:

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/

相关文章:

rust - 当 Iterator::map 返回 Result::Err 时,如何停止迭代并返回错误?

rust - 切片模式是否可以在不克隆的情况下用于解析命令行参数?

rust - 尝试在 rust api上实现rocket_cors CorsOptions

asynchronous - 始终返回 Ok HttpResponse 然后在 actix-web 处理程序中工作

rust - <'_> 未实现特征 `Serialize`

rust - Handlebars 三个阵列在一个循环中

for-loop - 如何修复这两个 for 循环以允许修改矢量内容?

rust - 模式匹配借用内容问题

rust - #[derive(Insertable)] 没有为 `std::string::String` 实现

rust - 如何使用 Diesel 在 sqlite 中存储任意 JSON 对象