Update: I found the solution, look in the bottom of this page...
I've got a Node.js, Express, MongoDB, Mongoose project written in CoffeScript and I can create and read data, but I can't update.
This is what my code looks like;
app.js
# update
app.put "/admin/:id.:format?", (req, res) ->
Content.findById req.body.content.id, (err, c) ->
c.title = req.body.content.title
c.body = req.body.content.body
c.save (err) ->
switch req.params.format
when "json"
res.send c.__doc
else
res.redirect "/admin"
edit.jade
h2 Edit Content
form(method='post', action='/admin/' + c.id)
input(name='content[id]', value=c.id, type='hidden')
input(name='_method', value='PUT', type='hidden')
div
label Title:
input(name='content[title]', value=c.title || '')
div
label Body:
textarea(name='content[body]')=c.body || ''
div
input(type='submit', value='Save')
And this is what my console says
127.0.0.1 - - [Thu, 13 Oct 2011 21:39:55 GMT] "POST /admin/4e96ec17fd7da7cb18000001 HTTP/1.1" 404 - "http://localhost:1234/admin/4e96ec17fd7da7cb18000001/edit" "Mozilla/5.0 (Macintosh; Intel Mac O开发者_开发知识库S X 10_7_1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.83 Safari/535.2"
And this is what my browser tells me
Cannot POST /admin/4e96ec17fd7da7cb18000001
The form sends a POST request to the server, but your route is for PUT requests.
I found the solution on http://expressjs.com/guide.html:
"When using methods such as PUT with a form, we can utilize a hidden input named _method, which can be used to alter the HTTP method. To do so we first need the methodOverride middleware, which should be placed below bodyParser so that it can utilize it’s req.body containing the form values."
app.use express.bodyParser()
app.use express.methodOverride()
精彩评论