2011-05-03 8 views
6

¿Alguien sabe si es posible agregar un nuevo atributo al conjunto de atributos clave (Nombre, Descripción, Enlace permanente, Descripción meta, etc.) de un producto? La idea es que quiero tener estos atributos disponibles cuando creo un producto en lugar de agregarlos luego a través de Propiedades del producto.Spree: personalice los atributos clave de un producto

Gracias.

Respuesta

9

La forma más sencilla sería agregar atributos directamente al modelo de Producto a través de migraciones. Las validaciones se pueden agregar a través del uso de decoradores, el patrón preferido dentro de Spree para reemplazar los modelos.

# in app/models/product_decorator.rb 
Product.class_eval do 
    validates :some_field, :presence => true 
end 

Otra opción sería crear un modelo secundario para sus campos extendidos. Tal vez ProductExtension

# in app/models/product_extension.rb 
class ProductExtension < ActiveRecord::Base 
    belongs_to :product 

    validates :some_field, :presence => true 
end 

# in app/models/product_decorator.rb 
Product.class_eval do 
    has_one :product_extension 
    accepts_nested_attributes_for :product_extension 
    delegate :some_field, :to => :product_extension 
end 

Luego, en los formularios de creación de productos puede proporcionar estos campos con fields_for. Creo que una advertencia con esto es que va a necesitar tener el modelo de Producto creado antes de que la extensión sea utilizable. Probablemente puedas evitar esto con un poco de lógica extra en los controladores de producto para crear acción.

0

Mi manera de extender el modelo de producto para Spree (a través de delegate_belongs_to):

#app/models/product_decorator.rb 
Spree::Product.class_eval do 
    has_one :product_extension 
    accepts_nested_attributes_for :product_extension, :allow_destroy => true 
    delegate_belongs_to :product_extension, :some_field 
    attr_accessible :some_field 
end 

#app/models/product_extension.rb 
class ProductExtension < ActiveRecord::Base 
    belongs_to :product, :class_name => 'Spree::Product' 
    attr_accessible :some_field 
end 
Cuestiones relacionadas