There is an html form..
<form class="card" method="POST">
<div class="card-body">
<sup>title</sup>
<input required type="text" name="title" class="form-control">
<sup>description</sup>
<input type="text" name="description" class="form-control">
</div>
<div class="card-body row">
<div class="col-sm">
<sup class="float-start">start</sup>
<input
class="form-control my-2"
type="date"
name="st_date"
/>
</div>
<div class="col-sm">
<sup class="float-start">end</sup>
<input
class="form-control my-2"
type="date"
name="en_date"
/>
</div>
</div>
<div class="card-footer">
<input type="submit" value="submit" class="btn btn-sm btn-outline-primary mt-2">
</div>
</form>
There is a model..
#[derive(Debug, Clone, Deserialize, Serialize, Queryable, Selectable, Insertable)]
#[diesel(table_name = crate::schema::provision_d)]
pub struct NewPrD {
pub user_id: i32,
pub title: String,
pub description: Option<String>,
pub st_date: Option<NaiveDate>,
pub en_date: Option<NaiveDate>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FormPrD {
pub title: String,
pub description: Option<String>,
pub st_date: Option<NaiveDate>,
pub en_date: Option<NaiveDate>,
}
skip (pub description: Option) - works.
skipping st_, en_ - does not work.
I solved this problem like this..
pub async fn post_creat_days(
State(pool): State<Pool>,
TypedHeader(cookie): TypedHeader<Cookie>,
Form(form): Form<FormPrD>,
) -> impl IntoResponse {
let token = auth::views::request_token(
TypedHeader(cookie)
).await;
let s: Option<String> = Some(form.st_date.clone().expect("REASON"));
let s_value = s.as_deref().unwrap_or("default string");
let e: Option<String> = Some(form.en_date.clone().expect("REASON"));
let e_value = e.as_deref().unwrap_or("default string");
let start = NaiveDate::parse_from_str(&s_value, "%Y-%m-%d");
let end = NaiveDate::parse_from_str(&e_value, "%Y-%m-%d");
let mut conn = pool.get().await.unwrap();
use schema::provision_d::dsl::*;
if s_value == "" && e_value == "" {
let no_prv = NoneNewPrD {user_id: token.clone().unwrap().claims.id, title: form.title.clone(), description: form.description.clone(), created_at: Utc::now()};
let _ = diesel::insert_into(provision_d)
.values(no_prv)
.returning(NoneNewPrD::as_returning())
.get_result(&mut conn)
.await;
} else if s_value != "" && e_value == "" {
let st_prv = StNewPrD {user_id: token.clone().unwrap().claims.id, title: form.title.clone(), description: form.description.clone(), st_date: Some(start.expect("REASON")), created_at: Utc::now()};
let _ = diesel::insert_into(provision_d)
.values(st_prv)
.returning(StNewPrD::as_returning())
.get_result(&mut conn)
.await;
} else if s_value == "" && e_value != "" {
let en_prv = EnNewPrD {user_id: token.clone().unwrap().claims.id, title: form.title.clone(), description: form.description.clone(), en_date: Some(end.expect("REASON")), created_at: Utc::now()};
let _ = diesel::insert_into(provision_d)
.values(en_prv)
.returning(EnNewPrD::as_returning())
.get_result(&mut conn)
.await;
} else {
let prv = NewPrD {user_id: token.clone().unwrap().claims.id, title: form.title.clone(), description: form.description.clone(), st_date: Some(start.expect("REASON")), en_date: Some(end.expect("REASON")), created_at: Utc::now()};
let _ = diesel::insert_into(provision_d)
.values(prv)
.returning(NewPrD::as_returning())
.get_result(&mut conn)
.await;
}
return Redirect::to("/").into_response()
}
replaced the model
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FormPrD {
pub title: String,
pub description: Option<String>,
pub st_date: Option<String>,
pub en_date: Option<String>,
}
Is there any other way to skip fields..?