2011-12-21 64 views
0

我有一个Rails模型(持续使用Mongoid),可以由任何注册用户进行协作编辑。但是,我想只允许编辑任何特定的属性,如果它以前是空的或零。只有以前是空的,才接受Rails模型属性

例如,假设有人创建了一个对象,并将其title属性设置为"Test Product"。然后,另一位用户出现并想为price添加一个值,该值目前为nil

在锁定先前输入的属性的同时,执行此操作的最佳方法是什么?

回答

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 
0

最简单的方法,我认为,是形式本身为它检查。 只需说add:disabled =>如果人员不能编辑输入字段,则为true。

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

(我觉得有写这个代码更漂亮的方式)

但是,通过使用该用户具有视觉反馈,他不能做的事情,它始终是最好不要allor东西比给出错误信息

+1

你仍然需要模型验证,所以用户不能只是修改表单域并提交它。 – iwasrobbed 2011-12-21 15:19:03

+0

好点:)所以我会去gareth和我的帖子的组合 – 2011-12-21 15:26:43

相关问题