Есть ли способ обойти защиту массового присвоения?
У меня есть приложение Rails 3, которое JSON кодирует объекты, чтобы хранить их в хранилище ключей/значений Redis.
Когда я извлекаю объекты, я пытаюсь декодировать JSON и создавать их из данных следующим образом:
def decode(json)
self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end
Проблема заключается в том, что это связано с массовым присваиванием, которое запрещено (по уважительной причине, мне сказали!) для атрибутов, которые я не предоставил attr_writer.
Можно ли обойти защиту массового присвоения только для этой операции?
Ответы
Ответ 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