Сообщение об ошибке говорит вам все, что вам нужно знать:
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']
шаблонов/index.html.tera
<html />
Большинство шаблонных двигателей работают на структуру данных, которая отображает имя со значением. Во многих случаях это так просто, как HashMap
, но Rocket позволяет передавать все, что может быть сериализовано. Это предназначено для, чтобы разрешить передачу в структуре, но также позволяет передавать вещи, которые не сопоставляют имена с значениями, как чистая строка.
У вас есть два варианта:
- создать
HashMap
(или, может быть, BTreeMap
) значений.
- Реализовать
Serialize
для структуры и передать в
Вот первый вариант:.
use std::collections::HashMap;
let mut serialized = HashMap::new();
serialized.insert("greeting", "hello");
Template::render("index", &serialized)
Почему вы вывода и вручную реализации '' Serialize' для User'? Просто используйте производную сериализацию, и она должна работать, насколько я могу судить. – belst
Я думал, что мне это не нужно. Однако это требуется во время компиляции. 1. Прокомментировать 'impl Serialize for User' 2. Комментарий' let serialized = serde_json :: to_string (& query) .unwrap(); ' 3.'$ cargo run' ' Template :: render ("index", & query) // ошибка, черта 'serde :: ser :: Serialize' не реализована для 'mlib :: models :: User'' –
@belst Пожалуйста, позвольте мне учить, если вы не возражаете. –