ventajas por planifico ley implementacion impacto hijo evaluo desventajas cuándo creó como asignación asignacion ruby-on-rails ruby ruby-on-rails-3 mass-assignment

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.