我有一個Rails模型(持續使用Mongoid),可以由任何註冊用戶進行協作編輯。但是,我想只允許編輯任何特定的屬性,如果它以前是空的或零。只有以前是空的,才接受Rails模型屬性
例如,假設有人創建了一個對象,並將其title
屬性設置爲"Test Product"
。然後,另一位用戶出現並想爲price
添加一個值,該值目前爲nil
。
在鎖定先前輸入的屬性的同時,執行此操作的最佳方法是什麼?
我有一個Rails模型(持續使用Mongoid),可以由任何註冊用戶進行協作編輯。但是,我想只允許編輯任何特定的屬性,如果它以前是空的或零。只有以前是空的,才接受Rails模型屬性
例如,假設有人創建了一個對象,並將其title
屬性設置爲"Test Product"
。然後,另一位用戶出現並想爲price
添加一個值,該值目前爲nil
。
在鎖定先前輸入的屬性的同時,執行此操作的最佳方法是什麼?
窺視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
最簡單的方法,我認爲,是形式本身爲它檢查。 只需說add:disabled =>如果人員不能編輯輸入字段,則爲true。
<% if @my_object.name %>
<%= f.text_field :name, :disabled => true %>
<% else %>
<%= f.text_field :name, :disabled => true %>
<% end %>
(我覺得有寫這個代碼更漂亮的方式)
但是,通過使用該用戶具有視覺反饋,他不能做的事情,它始終是最好不要allor東西比給出錯誤信息
你仍然需要模型驗證,所以用戶不能只是修改表單域並提交它。 – iwasrobbed 2011-12-21 15:19:03
好點:)所以我會去gareth和我的帖子的組合 – 2011-12-21 15:26:43