2017-02-06 6 views
-1

Я хочу отобразить значение, полученное из базы данных с помощью Diesel, и подавать его как HTML с помощью Rocket.rs.Как отобразить значение, полученное с помощью Diesel в HTML, с использованием шаблона Tera в Rocket.rs

The sample code is here.

Он получает User {id: 1, name: "yamada"} из БД в # [get ("/")] из SRC/main.rs и пытается сделать его с шаблоном.

возвращается Эта ошибка:

Error: Error rendering Tera template 'index': Failed to value_render 'index.html.tera': context isn't an object 
+0

Почему вы вывода и вручную реализации '' Serialize' для User'? Просто используйте производную сериализацию, и она должна работать, насколько я могу судить. – belst

+0

Я думал, что мне это не нужно. Однако это требуется во время компиляции. 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'' –

+0

@belst Пожалуйста, позвольте мне учить, если вы не возражаете. –

ответ

0

Сообщение об ошибке говорит вам все, что вам нужно знать:

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 позволяет передавать все, что может быть сериализовано. Это предназначено для, чтобы разрешить передачу в структуре, но также позволяет передавать вещи, которые не сопоставляют имена с значениями, как чистая строка.

У вас есть два варианта:

  1. создать HashMap (или, может быть, BTreeMap) значений.
  2. Реализовать Serialize для структуры и передать в

Вот первый вариант:.

use std::collections::HashMap; 

let mut serialized = HashMap::new(); 
serialized.insert("greeting", "hello"); 
Template::render("index", &serialized) 
+0

Видимо, я, казалось, был ужасно растерян. Как вы сказали, я мог бы реализовать его с помощью HashMap. Однако из-за других ошибок он все время терялся из виду. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^