2012-05-15 10 views
9

estoy usando Rails 3.2.3 con la gema de dinero-carriles y tengo un modelo de producto que tiene la siguiente:advertencia Deprecation para crear atributo 'moneda'

Mi modelo

class Product < ActiveRecord::Base 
    attr_accessible :name, :price 

    composed_of :price, 
    :class_name => "Money", 
    :mapping => [%w(price_cents cents), %w(currency currency_as_string)], 
    :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }, 
    :converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't convert #{value.class} to Money") } 


end 

mi prueba

require 'spec_helper' 

describe Product do 
    context "testing money gem" do 
    it "creates product with price" do 
     product = Product.create(:price => 200) 
     product.price.should eq(200) 
     product.price_cents.should eq(20000) 
    end 
    end 
end 

advertencia Deprecation que estoy recibiendo.

% rspec spec/models/product_spec.rb 

Product 
    testing money gem 
DEPRECATION WARNING: You're trying to create an attribute `currency'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in <top (required)> at /home/map7/project/spec/models/product_spec.rb:6) 
    creates product with price 

Finished in 0.06682 seconds 
1 example, 0 failures 

¿Cómo puedo solucionar este problema de advertencia?

actualización

Si agrego 'moneda' de la tabla que empiece a funcionar. ¿Debería hacer esto sin embargo?

Respuesta

14

Al parecer, en Rails 3.2 y por encima de atributos arbitrarios (no atributos almacenados en la base de datos) ya no están permitidos. No parece haber una forma de evitarlo.

Aquí es la confirmación para el mensaje de desaprobación: https://github.com/rails/rails/commit/b2955edc y aquí es por qué: https://github.com/rails/rails/commit/50d395f96ea05da1e02459688e94bff5872c307b

En sus price_cents de casos y la moneda todavía necesitan ser almacenados en la base de datos y su clase compuesta por lo tomará de allí.

+0

Super extraño. No tuve que poner una columna de "moneda" en mi base de datos, ya que es opcional, según la gema. Me di cuenta de que esto solo estaba sucediendo en FactoryGirl si intentaba establecer objetos 'Money' en la columna' price' pero si cambiaba la configuración de 'Entero' a' price_cents' funcionaba bien sin vomitar las advertencias de depreciación. –

1

Agregado 'moneda: cadena' a mi modelo

Cuestiones relacionadas