仅当以前为空时才接受Rails模型属性

时间:2011-12-21 14:19:35

标签: ruby-on-rails ruby activerecord mongoid activemodel

我有一个可以由任何注册用户协作编辑的Rails模型(持久化Mongoid)。但是,我想允许编辑任何特定属性,只有它以前是空白或为零。

例如,假设有人创建了一个对象,并将其title属性设置为"Test Product"。然后另一个用户出现并希望为price添加一个值,直到现在为nil

在锁定先前输入的属性时,最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

查看ActiveRecord::Dirty模块,了解一些可用于执行此类操作的实用方法:

NON_UPDATABLE_ATTRIBUTES = [:name, :title, :price]
before_validation :check_for_previously_set_attributes

private
def check_for_previously_set_attributes
  NON_UPDATABLE_ATTRIBUTES.each do |att|
    att = att.to_s
    # changes[att] will be an array of [prev_value, new_value] if the attribute has been changed
    errors.add(att, "cannot be updated because it has previously been set") if changes[att] && changes[att].first.present?
  end
end

答案 1 :(得分:0)

我认为最简单的方法是在表单中检查它。 只需说:add:disabled =>如果此人无法编辑,则返回输入字段。

<% if @my_object.name %>
   <%= f.text_field :name, :disabled => true %>
<% else %>
   <%= f.text_field :name, :disabled => true %>
<% end %>    

(我认为编写此代码有一种更漂亮的方式)

但是通过使用它,用户有一个他无法做某事的视觉反馈,总是更好的不是所有东西而不是给出错误信息