Принимать атрибут модели Rails, только если он ранее был пустым - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть модель Rails (сохранена в Mongoid), которая может быть совместно отредактирована любым зарегистрированным пользователем. Однако я хочу разрешить редактирование любого конкретного атрибута, только если он ранее был пустым или нулевым.

Например, скажем, кто-то создал объект и установил для его атрибута title значение "Test Product". Затем приходит другой пользователь и хочет добавить значение для price, которое до сих пор было nil.

Каков наилучший способ сделать это, заблокировав ранее введенный атрибут?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Просмотрите в модуле 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 голосов
/ 21 декабря 2011

Самый простой способ, я думаю, это проверить его в самой форме.Просто скажите add: disabled => true в поле ввода, если человек не может его редактировать.

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

(я думаю, что есть более красивый способ написания этого кода)

Но используяу этого пользователя есть визуальная обратная связь о том, что он не может что-то сделать, всегда лучше ничего не делать, чем выдавать сообщение об ошибке

...