Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 防止更新到模型中某些值的轨道_Ruby On Rails_Ruby_Beforeupdate - Fatal编程技术网

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知道了。谢谢让它工作起来。