3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RustでWebアプリケーション作成 メモ

Last updated at Posted at 2018-04-19

ライブラリ宣言

#![feature(plugin, decl_macro)]
#![plugin(rocket_codegen)]

extern crate rocket_contrib;
extern crate rocket;

TemplateContext宣言

Templateとは、htmlを抽象化したものです。
TemplateContextとは、Templateの基本骨格のことです。

#[derive(Serialize)]
struct TemplateContext {
    name: String,
    items: Vec<String>
}

GET

indexのGET

#[get(パス)]の下に関数で、そのパスにアクセスされた時の挙動を書くことができます。
返り値がRedirectなら他の関数に流すことができます。

#[get("/")]
fn index() -> Redirect {
    Redirect::to("/hello/Unknown")
}

通常のGET

返り値をTemplateにすることで、Templateに変化を適応して出力することができます。

#[get("/hello/<name>")]
fn get(name: String) -> Template {
    let context = TemplateContext {
        name: name,
        items: vec!["One".into(), "Two".into(), "Three".into()],
    };
    Template::render("index", &context)
}

・Template::render(name, *context)
contextから./templates以下のパスnameからtemplateを生成します。
contextは任意の型で可能ですが、通常、HashMapかstructです。

404処理

#[catch(404)]
fn not_found(req: &Request) -> Template {
    let mut map = std::collections::HashMap::new();
    map.insert("path", req.uri().as_str());
    Template::render("error/404", &map)
}

ヘルパー関数

リテラルのところを書き換えましょう。
Templateに{{wow hoge}}と書くことで、後述のregister_helperメソッドでヘルパー関数を適応させることができるようになります。

type HelperResult = Result<(), RenderError>;

fn wow_helper(h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> HelperResult {
    if let Some(param) = h.param(0) {
        write!(rc.writer, "<b><i>{}</i></b>", param.value().render())?;
    }
    Ok(())
}

Rocketアプリケーションの生成

fn rocket() -> rocket::Rocket {
    rocket::ignite()
        .mount("/", routes![index, get])
        .catch(catchers![not_found])
        .attach(Template::custom(|engines| {
            engines.handlebars.register_helper("wow", Box::new(wow_helper));
        }))
}

・rocket::ignite() -> rocket::Rocket
Rocket.tomlに書いてある設定を適応させたRocketアプリケーションを生成します。
Rocket.tomlについてはこちら

・Rocket.mount(base: &str, routes: Vec)
baseはベースのパスを、
routesはベースから派生するパスを指定します。
(e.g.)
mount("/", routes![index, get])
この例でのindexとgetは、それぞれGET関数のindex関数とget関数です。
routes!マクロでVecを生成できます。

・Rocket.catch(catchers![not_found])
エラーをcatchします。
not_foundはnot_found関数です。

・Rocket.attach(Template::custom(|engines| {
engines.handlebars.register_helper(ヘルパーセレクター, Box::new(ヘルパー関数)
}))
Rocketアプリケーションに、ヘルパー関数を適応させます。

main関数

Rocketを走らせます。

fn main() {
    rocket().launch();
}

templateの書き方

String

<h1>Hi {{name}}</h1>

Vec

itemsという変数にVecが入っているとします。

<ul>
  {{#each items}}
     <li>{{this}}</li>
  {{/each}}
</ul>

ヘルパー関数

wowというヘルパートリガーに登録されているヘルパー関数を文字列"this"に適応させる場合です。

<p>Also, check {{ wow "this" }} (custom helper) out!</p>

Rocket.tomlの書き方

作成中です。
こちらも合わせてお読みください。

templateディレクトリを指定
[global]
template_dir = "templates"

css等の外部ファイルの読み方

・templates以下にcssディレクトリを配置する。
・cssディレクトリ以下にcssファイルを配置する。(今回はdefault.css)
・外部ファイルオープン用の関数を作成する。

use rocket::response::NamedFile;
use std::path::{Path, PathBuf};

#[get("/<path..>")]
fn extern_open(path: PathBuf) -> Option<NamedFile> {
    NamedFile::open(Path::new("templates/").join(path)).ok()
}

・外部ファイルオープン用の関数を登録する。

fn rocket() -> rocket::Rocket {
    rocket::ignite()
    /* ... */
    .mount("/", routes![index, get, extern_open])
    /* ... */
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?