我有一个before_save
在我Message
这样定义模型:
class Message < ActiveRecord::Base
before_save lambda { foo(publisher); bar }
end
Run Code Online (Sandbox Code Playgroud)
当我做:
my_message.update_attributes(:created_at => ...)
Run Code Online (Sandbox Code Playgroud)
foo
并被bar
执行.
有时,我想更新消息的字段而不执行foo
和bar
.
例如,如何更新created_at
字段(在数据库中)而不执行foo
和bar
?
ruby-on-rails before-filter update-attributes ruby-on-rails-3 before-save
我试图before_save
通过在我的值中添加"_was" 来获得旧值,但它似乎不起作用.
这是我的代码:
before_save :get_old_title
def get_old_title
puts "old value #{self.title_was} => #{self.title}"
end
Run Code Online (Sandbox Code Playgroud)
"title_was"和"title"都获得了新标题.
是否有可能获得旧的价值before_save
?
如您所知,before_save
回调在before_create
回调之前执行.
因此,有些人建议使用in before_save :method, :on => :create
而不是before_create
使得回调方法在适当的时间执行与其他回调(例如自动保存回调)相关.例如,请参阅此Pivotal Labs博客文章以及此StackOverflow答案.
但是,据我所知,该:on => :create
选项无法实现对before_save
回调的预期效果.换句话说,无论是否为创建,都会为每次保存执行回调.
该:on => :create
选项也似乎是有效的before_validation
回调,虽然.
有人可以确认是否:on => :create
应该适用于before_save
?它是否在以前的Rails版本中有效并且现在已经坏了,或者前面提到的链接是错误的?
假设:on => :create
无效,以下是否可接受,和/或有更好的方法吗?
before_save :callback_method, :if => :new_record?
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试用户模型中strip
变量的空格Username
.
我正在使用
before_save do
self.username.strip!
end
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用,我错过了什么?
我在模型的beforeSave上引发了一个Yii事件,只有在模型的特定属性发生变化时才会触发该事件.
我现在能想到如何做到这一点的唯一方法是创建一个新的AR对象并使用当前的PK查询旧模型的数据库,但这不是很好地优化.
这就是我现在所拥有的(注意我的表没有PK,这就是为什么我通过所有属性查询,除了我正在比较的那个 - 因此unset
函数):
public function beforeSave()
{
if(!$this->isNewRecord){ // only when a record is modified
$newAttributes = $this->attributes;
unset($newAttributes['level']);
$oldModel = self::model()->findByAttributes($newAttributes);
if($oldModel->level != $this->level)
// Raising event here
}
return parent::beforeSave();
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?也许将旧属性存储在新的本地属性中afterFind()
?
这有什么问题before_save-callback
?
class Order < ActiveRecord::Base
has_many :line_items, :dependent => :destroy, :inverse_of => :order
accepts_nested_attributes_for :line_items
attr_accessible :line_items_attributes
before_save :mark_line_items_for_removal
def mark_line_items_for_removal
line_items.each do |line_item|
line_item.mark_for_destruction if line_item.quantity.to_f <= 0
end
end
end
Run Code Online (Sandbox Code Playgroud)
当其中之一line_items
被标记为销毁时,line_item
将不会保存。然而,父 Order 对象确实得到了保存。返回 true 并没有什么区别......
关于 mark_for_destruction:http ://apidock.com/rails/v3.1.0/ActiveRecord/AutosaveAssociation/mark_for_destruction 以及为什么不是“:allow_destroy => true”?见这里:http : //weblogs.manas.com.ar/spalladino/2010/03/15/deleting-children-with-accepts_nested_attributes_for-in-rails/
我想检查是否在Rails的before_save回调中创建了一个模型.我还想检查它是否已被修改(更新时).
谢谢
ruby ruby-on-rails ruby-on-rails-3.1 before-save rails-activerecord
所以我正在使用XLTM文件,我希望用户确保它们保存为XLSM.当他们点击"保存"时,这工作正常,但我发现当他们点击"另存为"时,文件将保存为"*.xlsm.xlsm".我有点迷失了如何确保用户保存为XLSM,同时保持文件名为"filename.xlsm"而不是"filename.xlsm.xlsm".
'Action makes sure the user saves as XLSM file type.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim FileNameVal As String
If SaveAsUI Then
FileNameVal = Application.GetSaveAsFilename(, "Excel Macro-Enabled Workbook (*.xlsm), *.xlsm")
Cancel = True
If FileNameVal = "False" Then 'User pressed cancel
Exit Sub
End If
Application.EnableEvents = False
ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat
Application.EnableEvents = True
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
我认为问题可能是在写".xlsm":
ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat
Run Code Online (Sandbox Code Playgroud)
但是,如果没有写".xlsm",我会发现该文件保存为错误的文件后缀.(例如,如果我的XLTM文件名为Template(File001).xltm,并且用户打开一个新模板文件,它将另存为模板(File001)1(认为"1)1"是文件类型).
它可能是我的代码的结构,所以我需要指导如何修改它.
每当我的对象的单个键的值在解析云代码afterSave
挂钩中发生变化时,我都想发送推送通知。
Parse.Cloud.afterSave("Channel", function(request) {
var channel = request.object
// TODO: check if value of channel key "state" was changed
});
Run Code Online (Sandbox Code Playgroud)
如何检查密钥的值是否state
已更新?
这是我可以从request
对象中获得的所有数据:http : //parseplatform.org/Parse-SDK-JS/api/v1.11.0/Parse.Cloud.html#.TriggerRequest
该线程中建议的解决方案感觉不对:Parse Javascript API Cloud Code afterSave with access to beforeSave values
我知道我可以通过beforeSave
钩子中的脏方法来做到这一点。但是,这对我不起作用。为什么?如果我确实向许多用户发送推送通知,这需要一些时间。接收推送通知的客户端开始从服务器请求更新的频道对象。然而,他们可能会收到旧版本的对象,因为只要beforeSave
尚未完成发送所有推送,通道对象就不会持久保存在数据库中。
javascript after-save before-save parse-cloud-code parse-server
我有一个控制器和一个用giiant生成的updateAction:
public function actionUpdate($id) {
$model = $this->findModel($id);
if ($model->load($_POST) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过覆盖模型中的 beforeSave 来重命名文件:
public function beforeSave($insert) {
if ($this->isAttributeChanged('name')) {
rename($this->getOldAttribute('name') . '.pdf', $this->name . '.pdf');
}
parent::beforeSave($insert);
}
Run Code Online (Sandbox Code Playgroud)
似乎模型已保存,但保存后仍呈现表单,实际上不可能。我确信这是因为beforeSave
,因为如果我将其注释掉,一切都会正常。使用 beforeSave 怎么会导致这种不连贯的行为呢?我缺少什么?多谢!
before-save ×10
php ×2
ruby ×2
activerecord ×1
after-save ×1
excel ×1
excel-vba ×1
filenames ×1
javascript ×1
parse-server ×1
vba ×1
yii ×1
yii2 ×1