我有一个可以由任何注册用户协作编辑的Rails模型(持久化Mongoid)。但是,我想允许编辑任何特定属性,只有它以前是空白或为零。
例如,假设有人创建了一个对象,并将其title
属性设置为"Test Product"
。然后另一个用户出现并希望为price
添加一个值,直到现在为nil
。
在锁定先前输入的属性时,最好的方法是什么?
答案 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 %>
(我认为编写此代码有一种更漂亮的方式)
但是通过使用它,用户有一个他无法做某事的视觉反馈,总是更好的不是所有东西而不是给出错误信息