Pregunta

En mi tienda en línea, los usuarios pueden cambiar ciertas propiedades de sus órdenes (por ejemplo, su dirección de facturación), pero no en otros (por ejemplo, la dirección IP de origen). Los administradores, por el contrario, se permite modificar todos propiedades de orden.

Teniendo en cuenta, esto, ¿cómo puedo usar :attr_accessible para asegurar correctamente mi Modelo de la orden? O voy a tener que usarlo para marcar accesibles todos los atributos que los administradores pueden modificar y abstenerse de utilizar Order.update_attributes(params[:order]) en esas acciones del controlador que los usuarios normales pueden acceder?

¿Fue útil?

Solución

En términos generales, attr_accessible no es la herramienta que está buscando y rieles no viene con nada construido en el que hace lo que quiere.

Si desea tener un control preciso sobre quién puede actualizar atributos específicos de un modelo, que podría hacer algo como:

class Order < ActiveRecord::Base
  def update_attributes_as_user(values, user)
    values.each do |attribute, value|
      # Update the attribute if the user is allowed to
      @order.send("#{attribute}=", value) if user.can_modify?(attribute)
    end
    save
  end
end

A continuación, puede cambiar su Order.update_attributes(params[:order]) a Order.update_attributes_as_user(params[:order], current_user) y suponiendo que implemente el método para volver User#can_modify? cierto en los casos correctos, debería funcionar.

Otros consejos

Yo tenía el mismo problema y ahora estoy usando esta joya http://github.com/dmitry/ attr_accessible_block

Es fácil y utilizado en algún sitio web de producción.

Sí, vas a tener que modificar las acciones, lo que los permisos se comprueban dentro de las acciones. Llamando Order#update_attributes no funcionará para el usuario general.

No puedo rember un plugin de autorización basada en roles que permitiría algo que busca. Esto se debe a que estos complementos MixIn a los controladores y no los modelos. También tendrían que mixin en ActiveRecord::Base para comprobar si hay attr_accesible etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top