Подтвердить что ты не робот

Есть ли способ обойти защиту массового присвоения?

У меня есть приложение Rails 3, которое JSON кодирует объекты, чтобы хранить их в хранилище ключей/значений Redis.

Когда я извлекаю объекты, я пытаюсь декодировать JSON и создавать их из данных следующим образом:

def decode(json)
  self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end

Проблема заключается в том, что это связано с массовым присваиванием, которое запрещено (по уважительной причине, мне сказали!) для атрибутов, которые я не предоставил attr_writer.

Можно ли обойти защиту массового присвоения только для этой операции?

4b9b3361

Ответ 1

assign_attributes с without_protection: true кажется менее навязчивым:

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }, :without_protection => true)
user.name       # => "Josh"
user.is_admin?  # => true

@tovodeverett, упомянутый в комментарии, вы также можете использовать его с new, как это в 1 строке

user = User.new({ :name => 'Josh', :is_admin => true }, :without_protection => true)

Ответ 2

EDIT: kizzx2 Ответ - гораздо лучшее решение.

Вид взлома, но...

self.new do |n|
  n.send "attributes=", JSON.decode( json )["#{self.name.downcase}"], false
end

Это вызывает атрибуты = передача false для параметра guard_protected_attributes, который пропускает любые проверки массового присвоения.

Ответ 3

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

User.create do |user|
  user.name = "Josh"
end

Вы можете поместить это в метод.

new_user(name)
  User.create do |user|
    user.name = name
  end
end