2012-05-15 33 views
9

Tôi đang sử dụng Rails 3.2.3 với số tiền-ray đá quý và tôi đã có một mô hình sản phẩm trong đó có những điều sau đây:cảnh báo Deprecation để tạo thuộc tính 'tệ'

Mô hình của tôi

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 

Bài kiểm tra của tôi

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 

Cảnh báo về việc ngừng sử dụng Tôi nhận được.

% 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 

Làm cách nào để khắc phục cảnh báo không dùng nữa này?

Cập nhật

Nếu tôi thêm 'tệ' vào bảng nó bắt đầu làm việc. Tôi có nên làm điều này không?

Trả lời

14

Rõ ràng trong Rails 3.2 trở lên thuộc tính tùy ý (các thuộc tính không được lưu trữ trong cơ sở dữ liệu) không còn được phép. Dường như không có cách nào xung quanh nó.

Đây là cam kết cho thông điệp không chấp nhận: https://github.com/rails/rails/commit/b2955edc và đây là lý do: https://github.com/rails/rails/commit/50d395f96ea05da1e02459688e94bff5872c307b

Trong trường hợp price_cents và tiền tệ của bạn vẫn cần phải được lưu trữ trong cơ sở dữ liệu và sau đó lớp sáng tác của bạn sẽ mang nó từ đó.

+0

Siêu lạ. Tôi không phải đặt một cột "tiền tệ" trong cơ sở dữ liệu của tôi, vì đây là tùy chọn, theo gem. Tôi nhận thấy điều này chỉ xảy ra trong FactoryGirl của tôi nếu tôi cố gắng đặt các đối tượng 'Money' thành cột' price' nhưng nếu tôi thay đổi để đặt 'Integer' cent thành' price_cents' thì nó hoạt động tốt mà không có cảnh báo ngừng sử dụng. –

1

Added 'tệ: string' để mô hình của tôi

Các vấn đề liên quan