From 2e98f140e810d5271258df6905e744737734c666 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Tue, 21 Nov 2017 23:21:01 +0100 Subject: Add handlers for creating new Posts. --- src/main.rs | 40 ++++++++++++++++++++++++++++++++++++++++ src/models.rs | 12 +++++++++++- templates/index.html | 1 + templates/new_post.html | 29 +++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 templates/new_post.html diff --git a/src/main.rs b/src/main.rs index 1d20cb0..a709cd9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,15 @@ impl<'a> Responder<'a> for IndexTemplate<'a> { } } +impl<'a> Responder<'a> for posts::NewPostTemplate<'a> { + fn respond_to(self, _: &Request) -> Result, Status> { + Response::build() + .header(ContentType::HTML) + .sized_body(Cursor::new(format!("{}", &self))) + .ok() + } +} + fn get_posts(conn: rocket_blog::DbConn) -> Vec { use schema::posts::dsl::*; posts.filter(published.eq(false)) @@ -50,9 +59,40 @@ fn index_json(conn: rocket_blog::DbConn) -> Json> { Json(get_posts(conn)) } +mod posts { + use rocket::request::Form; + use rocket::response::Redirect; + use diesel::{self, ExecuteDsl}; + + #[derive(BartDisplay)] + #[template = "templates/new_post.html"] + pub struct NewPostTemplate<'a> { + title: &'a str, + post: ::models::NewPost + } + + #[get("/new", format = "text/html")] + fn new<'a>(_conn: ::rocket_blog::DbConn) -> NewPostTemplate<'a> { + NewPostTemplate { title: "Bloggen", post: Default::default() } + } + + #[post("/create", data="")] + fn create(post: Form<::models::NewPost>, conn: ::rocket_blog::DbConn) -> Redirect { + use ::schema::posts; + + diesel::insert(post.get()) + .into(posts::table) + .execute(&*conn) + .expect("Error saving post."); + + Redirect::to("/") + } +} + fn main() { rocket::ignite() .manage(rocket_blog::init_db_pool()) .mount("/", routes![index, index_json]) + .mount("/posts", routes![posts::new, posts::create]) .launch(); } diff --git a/src/models.rs b/src/models.rs index d8aa0aa..67038f1 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,7 +1,17 @@ -#[derive(Debug, Default, FromForm, Serialize, Queryable)] +use super::schema::posts; + +#[derive(Serialize, Queryable)] pub struct Post { pub id: i32, pub title: String, pub body: String, pub published: bool, } + +#[derive(Default, FromForm, Insertable)] +#[table_name="posts"] +pub struct NewPost { + pub title: String, + pub body: String, + pub published: bool, +} diff --git a/templates/index.html b/templates/index.html index 2a3a95b..674b867 100644 --- a/templates/index.html +++ b/templates/index.html @@ -4,6 +4,7 @@ {{ title }} +

Create new post

{{# posts }}{{> post_teaser.html }}{{/ posts }} diff --git a/templates/new_post.html b/templates/new_post.html new file mode 100644 index 0000000..93de696 --- /dev/null +++ b/templates/new_post.html @@ -0,0 +1,29 @@ + + + + {{ title }} + + +

Create a new post

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ + -- cgit v1.2.3