Ограничить атрибут при обновлении, но не при создании, но потерпеть неудачу, когда обновление не может быть обновлено - PullRequest
1 голос
/ 19 февраля 2020

Я читал этот пост на

В Rails, как мне ограничить, какие атрибуты можно обновлять, не мешая их созданию?

Проблема в том, что u.save возвращает true, поэтому создается впечатление, что все значения обновлены. Когда они этого не сделали.

Есть ли способ использовать attr-readonly, но при save вернуть false, если атрибут только для чтения?

class User < ActiveRecord::Base
  attr_accessible :name
  attr_readonly :name
end


> User.create(name: "lorem")
> u = User.first
=> #<User id: 1, name: "lorem">
> u.name = "ipsum"
=> "ipsum"
> u.save
=> true
> User.first.name
=> "lorem

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете использовать метод валидатора, чтобы записать ошибку при обнаружении изменений в поле только для чтения.

Class User
  validate :name_not_changed

  private

  def name_not_changed
    return unless name_changed?

    errors.add(:name, 'Cannot change name of User')
  end
end

Это действительно необходимо? Если вы делаете свой атрибут доступным только для чтения, почему вы все еще оставляете возможность его изменения и дополнительно нуждаетесь в ошибках проверки для этой операции? В идеале, вы не должны позволять использовать это имя при обновлении моделей, и на этом история заканчивается, ошибок валидации не требуется.

...