2017-11-05 4 views
-1

Node.js、Express、MethodOverrideを使用して、フォームの更新をモデル(私のユーザーモデル)の1つだけにしています。MethodOverride PUTが動作しない

Userモデル:

var userSchema = new mongoose.Schema({ 

email: { type: String, unique: true, lowercase: true }, 
    password: String, 

    profile: { 
    name: { type: String, default: 'Company Name' }, 
    location: { type: String, default: 'Location' }, 
    website: { type: String, default: 'Your Website' }, 
    picture: { type: String, default: '' } 
    }, 

    assetNumPre: { type: String, default: 'test' }, // this is the one I want to change 

}); 

module.exports = mongoose.model('User', userSchema); 

HTMLフォーム:次に

<form role="form-inline"action="/dashboard/settings/assetNumber?_method=PUT" method="POST"> 
<div class="col-md-3"> 
    <div class="form-group"> 
    <label for="prefix" class="control-label">Prefix for Asset Number</label> 
    <br> 
    <small>Any alphanumeric characters to a limit of 6</small> 
    <input type="text" class="form-control" id="prefix" name="prefix" placeholder="Prefix max 6 characters" maxlength="6" value="{{ prefix }}"> 
    </div><!-- Prefix for Asset Number--> 
    <br> 
    <div class="box-footer"> 
    <button type="submit" class="btn btn-primary">Submit</button> 
    </div> 
    </div> 
</form> 

ルート:私のルートが欠落している

app.put('/dashboard/settings/assetNumber', 
setRender('dashboard/settings/assetNumbers'), 
setRedirect({auth: '/login'}), 
isAuthenticated, 
dashboard.getDefault, 
(req, res) => { 
var prefix = req.body.prefix; 
console.log(req.params); 
User.findByIdAndUpdate({_id: req.params.user_id}, prefix, function(err, UpdatedUser) { 
    if (err) { 
    res.send(err); 
    } 
    console.log(UpdatedUser); 
    }); 
res.locals.prefix = req.user.assetNumPre; 
}); 

ことの一つは、私はそれを保存する必要がある場所であるreq.user.assetNumPreです私はこれを行う方法の手がかりがありませんPUTリクエスト。ドキュメントはあまり役に立ちません。

数日前にスタックオーバーフローの例からルートを取得しましたが、リンクを見つけることができません。 DELETEリクエストを既に完了しているため、私のapp.jsにメソッドのオーバーライドがありました。モデルには正しいフィールドがあり、ショーページに表示されるデフォルトのテスト値があります。

+0

「機能しない」とはどういう意味ですか? –

+0

@AndyRay更新していなかったので、私はそれを言っていたはずです。 'findbyidandupdate'だからやっていないと思っていた – Kirbytech

答えて

1

あなたはこれを呼んでいる:

var prefix = req.body.prefix; 

findByIdAndUpdate takes an Object、いない特定のフィールドを更新するための値、:

User.findByIdAndUpdate({_id: req.params.user_id}, prefix... 

しかし、接頭辞は唯一の値です。

ので、試してみてください。

User.findByIdAndUpdate({_id: req.params.user_id}, { assetNumPre: prefix }... 
+0

ありがとう、古いコードに戻ってそこから例を取って、うまくいきました。私は答えとして私の新しいルートを掲示するでしょうが、あなたが私の問題の解決策です。 – Kirbytech

0

ここで固定ルートです:

app.put('/dashboard/settings/assetNumber', 
    setRedirect({auth: '/login', success: '/dashboard/settings/assetNumber', failure: '/dashboard/settings/assetNumber'}), 
    isAuthenticated, 
    (req, res) => { 
     User.findById(req.user.id, function(err, user) { 
     if (err) return (err); 
     user.assetNumPre = req.body.prefix || 'pre'; 

     user.save(function(err) { 
     if (err) return (err); 
      req.flash('success', { msg: 'Asset Number Prefix updated.' }); 
      res.redirect(req.redirect.success); 
     }); 
    }); 

    res.locals.prefix = req.user.assetNumPre; 
    }); 

だから、いくつかのことが問題の一部ではなかったことに変更。コールバック関数の中にデータを設定する必要があることが分かりました。次にuser.saveを実行します。

関連する問題