Ruby on rails 防止更新到模型中某些值的轨道
在我的应用程序中,我有Ruby on rails 防止更新到模型中某些值的轨道,ruby-on-rails,ruby,beforeupdate,Ruby On Rails,Ruby,Beforeupdate,在我的应用程序中,我有note.rb,模式如下所示。我想做的是限制编辑笔记的能力。基本上,如果注释是在过去24小时内创建的,则允许您更新任何您想要的内容。24小时后,您所能做的就是在时间更改提醒。我在note.rb文件中有一个方法,用于检查注释是否可编辑。如果是,则显示不同的分部。但这只会限制前端,如果有人让编辑窗口保持打开状态,或者键入URL,他们仍然可以在24小时后编辑注释 我试图做的是在更新之前编写一个方法,检查是否允许更新注释的正文。无论怎样,您都可以在时间更新提醒。部分问题在于,控制器
note.rb
,模式如下所示。我想做的是限制编辑笔记的能力。基本上,如果注释是在过去24小时内创建的,则允许您更新任何您想要的内容。24小时后,您所能做的就是在时间更改提醒。我在note.rb
文件中有一个方法,用于检查注释是否可编辑。如果是,则显示不同的分部。但这只会限制前端,如果有人让编辑窗口保持打开状态,或者键入URL,他们仍然可以在24小时后编辑注释
我试图做的是在更新之前编写一个方法,检查是否允许更新注释的正文。无论怎样,您都可以在
时间更新提醒。部分问题在于,控制器通过params[:reschedule]
和params
知道这是否只是在时间对提醒的更改的方式在模型中不可访问
# == Schema Information
#
# Table name: notes
#
# id :integer not null, primary key
# body :text
# remind_at :datetime
# created_at :datetime
# updated_at :datetime
# Only allow editing of notes that are less that 1 day old
def editable?
self.created_at > (Time.now-1.day)
end
如果它的质量分配..则在控制器或模型中包含属性或显式设置它我不明白,模型不必查看参数[:reschedule]来知道它是否“只是在时间上对提醒单元的更改”--模型就是正在更改的对象,它应该能够查看实际正在更改的内容,并确保它仅在
处提醒
查看params[:reschedule]
是不对的,即使您可以很容易地做到这一点,因为可以想象params[:reschedule]
可以在修改其他属性的同时设置,您也不希望允许这样做。在模型中这样做的唯一目的不是相信控制器正在做正确的事情(并且没有安全漏洞),而是确保只做实际允许的事情
如果我理解正确,允许更改的是,如果在
创建的
已过某个时间,则不更改任何属性,而是在
处提醒
所以,您真正需要做的就是查看验证挂钩中哪些属性发生了更改
我相信更改的方法应该可以做到这一点。它返回自上次保存以来已更改属性的列表。如果帖子太旧,您要确保它们只在
的提醒中包含内容
这样行吗
if self.created_at > (Time.now-1.day) &&
self.changed.find {|k| k.to_s != "remind_at"}
# BAD, they're trying to save some other attribute changed
end
您是否可以通过查看提醒是否更改(不再使用重新安排)来测试重新安排?如果没有,则向模型添加attr_访问器,以允许重新调度参数通过。此外,如果出现以下情况,您可以删除控制器中的参数!model.editable?,因此当您尝试更新时,它根本不会提交它们。最后,您可能希望添加一个验证,这样它会抛出一个错误-如果存在编辑注释的管理员方式,您可能不希望这样做。难道您不能在更新之前在您的中检查是否更改了提醒吗?
?@faiakism&@Swards我怎么会退出该方法?假设模型中满足某些条件,如何阻止更新的发生?是否有方法使失败
或我只是引发一个错误?如果在更新之前执行此操作,您可以返回false
并中止后一次回调。我不确定你是否想这样做。您可能希望添加一个验证并从控制器处理它,以显示相应的错误消息。另一方面,正如@Swards所说,如果你有一个管理方式来编辑,那么这将是一个问题。也许需要一个自定义验证来检查这个?@faiakism知道了。谢谢让它工作起来。