ruby-on-rails - Rails ActiveRecord 有条件地保护属性不被修改

标签 ruby-on-rails ruby-on-rails-3 activerecord attributes readonly

我有一个 Message 模型,其中包含 content 属性(字符串)和 sent 属性( bool 值)。 消息的内容在发送之前应该是可以修改的,之后该字段应该变为只读。(其他属性仍然可以修改,例如message_opened)。

我怎样才能做到这一点?我研究了覆盖 readonly? (仅适用于记录级别)、attr_readonly (无条件)和验证(不知道如何验证content 取决于其旧值和 sent 字段)。

最佳答案

事实证明验证是正确的方法:创建一个使用 attribute_changed? 的自定义验证(“attribute”是属性的名称,在本例中为“content”)和条件验证。

消息.rb:

validate_on_update :reject_modifying_content, if: :sent?

def reject_modifying_content
 errors[:content] << "can not be changed!" if self.content_changed?
end

参见Rails 3 check if attribute changed , Setting a field to read-only in Rails after it's createdhttp://api.rubyonrails.org/classes/ActiveModel/Dirty.html了解更多信息。

关于ruby-on-rails - Rails ActiveRecord 有条件地保护属性不被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317316/

相关文章:

ruby-on-rails - 如何为 Rails View 返回一个字符串

ruby-on-rails - Rails 面板问题

ruby-on-rails-3 - Rails 3.2.2 日志文件无序,请求交织在一起

ruby-on-rails - Activerecord opitimization - 一次查询所有的最佳方式?

ruby-on-rails - 如何使 select 查询在 rails 中相对更快?

ruby-on-rails - 我们可以在 rails 3.0 中使用 mailchimp 发送用户通知电子邮件吗

ruby-on-rails - 访问 GitHub 私有(private)仓库时部署到 ec2 实例失败

ruby-on-rails - Rails 3.2 什么时候使用它缓存到磁盘的页面?

ruby-on-rails - 如何根据事件记录中的 `updated_at` 列仅检索更新的记录

ruby-on-rails - 简单的形式将类添加到周围的 div