NoMethodError-自升级到Rails 4之后的新功能

时间:2018-08-21 17:38:04

标签: ruby-on-rails-4 activerecord

我机智了。我升级到Rails 4.2.10,一切都很糟糕。

这是/models/product.rb的相关部分

class Product < ActiveRecord::Base
  delegate_attributes :price, :is_master, :to => :master

这是/models/variant.rb:

class Variant < ActiveRecord::Base
  belongs_to :product

变体表具有“价格”和“ is_master”字段。产品表没有。

过去,人们可以访问Product.price并获取/设置主版本的价格(每个产品实际上只有一个版本,目前的设置方式)。

现在它抱怨:

NoMethodError: undefined method `price=' for #<Product:0x0000000d63b980>

是的。没有称为price =的方法。但是,为什么以前不是这个问题?如果创建该方法,我应该在该方法中放什么呢?

以下是在db / seeds.rb中生成产品的代码:

  product = Product.create!({
    name: "Product_#{i}",
    description: Faker::Lorem.sentence,
    store_id: u.store.id,
    master_attributes: {
      listing_folder_id: uuids[i],
      version_folder_id: uuids[i]
    }
  })

  product.price = 10
  product.save!
end

1 个答案:

答案 0 :(得分:0)

delegate_attributes不是Rails方法,看起来像是来自没有被主动维护的一个或多个gem?

如果您正在使用的任何宝石都有新版本可能会有所帮助,因为简短的答案是属性的“委托”部分将涉及设置属性,因此它会为您生成#price=

如果您想自己定义它,则应该这样做(在您的Product类中):

def price=(*args)
  master.price=(*args)
end

或者如果您想更明确:

def price=(amount)
  master.price = amount
end