【问题标题】:NoMethodError - new since upgrading to Rails 4NoMethodError - 升级到 Rails 4 后的新功能
【发布时间】:2018-08-21 17:38:03
【问题描述】:

我已经束手无策了。我升级到 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”字段。 Products 表没有。

过去的情况是,可以访问 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

【问题讨论】:

    标签: ruby-on-rails-4 activerecord


    【解决方案1】:

    delegate_attributes 不是 Rails 方法,看起来它来自一个没有积极维护的 gem(或多个 gem)?

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

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

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

    或者如果你想更明确:

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

    【讨论】:

    • 谢谢!我试试看。
    • 有问题的宝石是(我相信)active_tools。可能有些东西不能很好地结合在一起。
    • 这适用于价格,但如果我尝试以相同的方式设置 is_master,我会得到“堆栈级别太深”。嗯。
    猜你喜欢
    • 2016-03-06
    • 2022-09-28
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2018-04-26
    相关资源
    最近更新 更多