Pessoal, fiz todo o passo a passo do curso, mas ao editar um livro o formulário não está sendo preenchido com os dados do mesmo.
Fiz um console.log no ${data.livro.id}
no arquivo form.marko e o valor está vindo como undefined.
Podem me ajudar, por favor? Seguem os arquivos do projeto:
form.marko:
<html>
<body>
<h1>Cadastro de livros</h1>
<form action="/livros" method="post">
<div if(data.livro.id)>
<input type="hidden" name="_method" value="PUT">
<input type="hidden" id="id" name="id" value="${data.livro.id}" />
</div>
<div>
<label for="titulo">Título:</label>
<input type="text" id="titulo" name="titulo" value="${data.livro.titulo}" placeholder="coloque o título">
</div>
<div>
<label for="preco">Preço:</label>
<input type="text" id="preco" name="preco" value="${data.livro.preco}" placeholder="150.25">
</div>
<div>
<label for="descricao">Descrição:</label>
<textarea cols="20" rows="20" id="descricao" name="descricao" placeholder="insira a descricao">${data.livro.descricao}</textarea>
</div>
<input type="submit" value="Salvar">
</form>
</body>
</html>
livro-dao.js:
class LivroDao {
constructor(db) {
this._db = db;
}
<-- métodos lista() e adiciona() -->
buscaPorId(id) {
return new Promise((resolve, reject) => {
this._db.all(`
SELECT *
FROM livros
WHERE id = ?
`,
[id],
(erro, livro) => {
if (erro) return reject('Não foi possível encontrar o livro');
return resolve(livro);
});
});
}
atualiza(livro) {
return new Promise((resolve, reject) => {
this._db.run(`
UPDATE livros SET
titulo = ?,
preco = ?,
descricao = ?
WHERE id = ?
`, [
livro.titulo,
livro.preco,
livro.descricao,
livro.id
],
erro => {
if (erro) return reject('Não foi possível atualizar o livro');
resolve();
});
});
}
<-- método remove() -->
}
module.exports = LivroDao;
routes.js:
<-- rotas '/' e '/livros' -->
app.get('/livros/form', (req, res) =>
res.marko(require('../views/livros/form/form.marko'), { livro: {} })
);
app.get('/livros/form/:id', (req, res) => {
const id = req.params.id;
const livroDao = new LivroDao(db);
livroDao.buscaPorId(id)
.then(livro =>
res.marko(
require('../views/livros/form/form.marko'),
{ livro: livro }
)
)
.catch(erro => console.log(erro));
});
app.post('/livros', (req, res) => {
console.log(req.body);
const livroDao = new LivroDao(db);
livroDao.adiciona(req.body)
.then(res.redirect('/livros'))
.catch(erro => console.log(erro));
});
app.put('/livros', (req, res) => {
console.log(req.body);
const livroDao = new LivroDao(db);
livroDao.atualiza(req.body)
.then(res.redirect('/livros'))
.catch(erro => console.log(erro));
});
<-- rota '/livros/:id' para o método delete -->
Notei que existe essa pergunta já respondida e verifiquei as versões dos pacotes no package.json, está tudo certo.
Só falta esse detalhe pra eu finalizar o curso!
Desde já agradeço, Raphael