ruby-on-rails - planifico - ley de asignación universal por hijo
¿Hay una manera de eludir la protección de la asignación en masa? (3)
Tengo una aplicación Rails 3 que JSON codifica objetos para almacenarlos en un almacén de valores / claves Redis.
Cuando recupero los objetos, estoy tratando de descodificar el JSON y crear una instancia de los datos de la siguiente manera:
def decode(json)
self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end
El problema es que hacer esto implica una asignación masiva que no está permitida (¡por una buena razón, me dicen!) Para atributos a los que no les he dado la capacidad de attr_writer.
¿Hay alguna manera de evitar la protección de asignación de masa solo para esta operación?
También puede crear un usuario de esta manera que no está realizando la asignación en masa.
User.create do |user|
user.name = "Josh"
end
Es posible que desee poner esto en un método.
new_user(name)
User.create do |user|
user.name = name
end
end
assign_attributes
with without_protection: true
parece menos intrusivo:
user = User.new
user.assign_attributes({ :name => ''Josh'', :is_admin => true }, :without_protection => true)
user.name # => "Josh"
user.is_admin? # => true
@tovodeverett mencionado en el comentario también puede usarlo con el new
, como este en 1 línea
user = User.new({ :name => ''Josh'', :is_admin => true }, :without_protection => true)
EDITAR: kizzx2''s respuesta kizzx2''s es una solución mucho mejor.
Una especie de hack, pero ...
self.new do |n|
n.send "attributes=", JSON.decode( json )["#{self.name.downcase}"], false
end
Esto invoca atributos = pasa falso para el parámetro guard_protected_attributes que omitirá cualquier verificación de asignación en masa.