Spree: настройте ключевые атрибуты продукта

Кто-нибудь знает, можно ли добавить новый атрибут в набор ключевых атрибутов (имя, описание, постоянная ссылка, мета-описание и т. д.) продукта? Идея состоит в том, что я хочу, чтобы эти атрибуты были доступны при создании продукта, а не добавлялись позже через свойства продукта.

Спасибо.


person trivektor    schedule 03.05.2011    source источник


Ответы (2)


Самый простой способ — добавить атрибуты непосредственно в модель продукта с помощью миграции. Проверка может быть добавлена ​​с помощью декораторов, предпочтительного шаблона в Spree для переопределения моделей.

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

Другой вариант — создать вторичную модель для ваших расширенных полей. Возможно, 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

Затем в формах создания продукта вы можете заполнить эти поля полем fields_for. Я думаю, что одно предостережение заключается в том, что вам понадобится созданная модель продукта, прежде чем расширение станет пригодным для использования. Вероятно, вы могли бы обойти это с помощью дополнительной логики в действии создания контроллеров продукта.

person Cluster    schedule 19.06.2011

Мой способ расширить модель продукта для Spree (через 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
person Leo Lukin    schedule 24.10.2012