Templat-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:35:41 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com