我正在开发一个 mongoose/node.js/express 应用程序。
在我的 route ,我使用 express' app.param()将我的模型实例放入请求中的方法 - 而不是在每个 Controller 操作中获取它。
我在我的 Controller 中得到了 show 和 create 操作 - 但是我无法实现 update 操作。
这是我的相关 Controller 代码:
// mymodel-controller.js
var mongoose = require('mongoose')
var MyModel = mongoose.model('MyModel');
var utils = require('../../lib/utils');
"use strict";
exports.update = function (req, res, next) {
var mymodel = req.mymodel;
mymodel.set(req.body);
mymodel.slug = utils.convertToSlug(req.body.title);
mymodel.save(function(err, doc) {
if (!err) {
console.log('update successful');
// here i see the correctly updated model in the console, however the db is not updated
console.dir(doc);
return res.redirect('/mymodels/' + mymodel.slug);
} else {
console.error('update error', err);
return res.render('mymodels/edit', {
title: 'Edit Model',
model: mymodel,
errors: err.errors
});
}
});
}
奇怪的是, Mongoose 保存成功,我没有收到任何错误。 我在控制台上看到“更新成功”和正确更新的模型,但没有保存在数据库中。 我也尝试在更新和保存模型之前手动获取模型,而不是使用 app.param(..) 但我有同样的效果。 知道我在这里缺少什么吗?
更新
这是我设置 req.mymodel 的代码 - 较长路由文件的一部分。
在我的表演 Action 中,例如我还使用 req.mymodel 来显示它,到目前为止它工作正常。
/**
* mymodel ROUTES
*/
app.param('mymodel', function(req, res, next, id){
MyModel.findOne({ 'slug': id }, function(err, mymodel) {
if (err) {
next(err);
} else if (mymodel) {
req.mymodel = mymodel;
next();
} else {
res.status(404).render('404', {title: "Not found", errorMessage: "The requested mymodel was not found."});
}
});
});
app.get('/mymodels', mymodelsController.index);
app.get('/mymodels/new', mymodelsController.new);
app.post('/mymodels', mymodelsController.create);
app.get('/mymodels/:mymodel', mymodelsController.show);
app.get('/mymodels/:mymodel/edit', mymodelsController.edit);
app.put('/mymodels/:mymodel', mymodelsController.update); // that's the one not working with the code above
app.del('/mymodels/:mymodel', mymodelsController.destroy);
更新2
另一方面,此代码在我的 Controller 中运行并更新数据库(不过我更喜欢使用 instance.save())
exports.update = function (req, res, next) {
var mymodel = req.param('mymodel');
var query = { slug: mymodel };
var update = {};
update.title = req.param('title');
update.body = req.param('body');
update.points = req.param('points');
update.location = req.param('location');
update.slug = utils.convertToSlug(req.param('title'));
MyModel.update(query, update, function (err, numAffected) {
if (err) return next(err);
if (0 === numAffected) {
return next(new Error('no model to modify'), null);
}
res.redirect('/mymodels/' + update.slug);
});
}
最佳答案
问题确实是我在路由中设置 req.param 值的方式。
而不是在我的路由文件中这样做:
app.param('mymodel', function(req, res, next, id){
MyModel.findOne({ 'slug': id }, function(err, mymodel) {
if (err) {
next(err);
} else if (mymodel) {
req.mymodel = mymodel;
next();
} else {
res.status(404).render('404', {title: "Not found", errorMessage: "The requested mymodel was not found."});
}
});
});
我必须声明一个每次加载实例的 Controller Action ,比如
app.param('mymodel', mymodelController.load);
这很像 this example .
关于node.js - Mongoose model.save() 在更新时不持久保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19680063/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
ActiveRecord用于在每次调用保存方法时调用after_save回调,即使模型没有更改并且没有生成插入/更新查询也是如此。这实际上是默认行为。在大多数情况下这没问题。但是一些after_save回调对模型是否实际保存的事情很敏感。有没有办法确定模型是否实际保存在after_save中?我正在运行以下测试代码:classStage 最佳答案 ActiveRecordusetocallafter_savecallbackeachtimesavemethodiscalledevenifthemodelwasnotchangedan
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint