Edit post

This commit is contained in:
Sam Samai 2021-09-12 19:21:01 +10:00
parent f97c081c2a
commit c427e4e89b
2 changed files with 93 additions and 0 deletions

View File

@ -94,6 +94,47 @@ async fn create(
Ok(HttpResponse::Found().header("location", "/").finish())
}
#[get("/{id}")]
async fn edit(data: web::Data<AppState>, id: web::Path<i32>) -> Result<HttpResponse, Error> {
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
let template = &data.templates;
let post: post::Model = Post::find_by_id(id.into_inner())
.one(&conn)
.await
.expect("could not find post")
.unwrap();
let mut ctx = tera::Context::new();
ctx.insert("post", &post);
let body = template
.render("edit.html.tera", &ctx)
.map_err(|_| error::ErrorInternalServerError("Template error"))?;
Ok(HttpResponse::Ok().content_type("text/html").body(body))
}
#[post("/{id}")]
async fn update(
data: web::Data<AppState>,
id: web::Path<i32>,
post_form: web::Form<post::Model>,
) -> Result<HttpResponse, Error> {
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
let form = post_form.into_inner();
post::ActiveModel {
id: Set(Some(id.into_inner())),
title: Set(form.title.to_owned()),
text: Set(form.text.to_owned()),
}
.save(&conn)
.await
.expect("could not edit post");
Ok(HttpResponse::Found().header("location", "/").finish())
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
std::env::set_var("RUST_LOG", "actix_web=info");
@ -138,4 +179,6 @@ pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(list);
cfg.service(new);
cfg.service(create);
cfg.service(edit);
cfg.service(update);
}

View File

@ -0,0 +1,50 @@
{% extends "layout.html.tera" %} {% block content %}
<div class="row">
<h4>Edit Post</h4>
<div class="twelve columns">
<div class="ten columns">
<form action="/{{ post.id }}" method="post">
<div class="twelve columns">
<input
type="text"
placeholder="title"
name="title"
id="title"
value="{{ post.title }}"
autofocus
class="u-full-width"
/>
<input
type="text"
placeholder="content"
name="text"
id="text"
value="{{ post.text }}"
autofocus
class="u-full-width"
/>
</div>
<div class="twelve columns">
<div class="two columns">
<a href="/">
<input type="button" value="cancel" />
</a>
</div>
<div class="eight columns"></div>
<div class="two columns">
<input type="submit" value="save post" />
</div>
</div>
</form>
</div>
<div class="two columns">
<form action="/{{ post.id }}" method="post">
<div class="two columns">
<input type="hidden" name="_method" value="delete" />
<input id="delete-button" type="submit" value="delete post" />
</div>
</form>
</div>
</div>
</div>
{% endblock content %}