我正在尝试使用位于此处的“magento-rb”库将产品从Magento商店下载到我的Rails数据库中:https://github.com/joelvh/magento-rb
我尝试过以下代码:
xml_api = Magento::XmlApi.new "http://website.com/api/xmlrpc/", "myusername", "mypassword", :debug => true
products = xml_api.call("catalog_product.list")
products.each do |p|
@exists = Product.where("sku = ?",p["sku"])
if @exists
@product = Product.find_by_sku(p["sku"])
else
@product = Product.new
end
@product.sku = p["sku"]
@product.name = p["name"]
@product.mage_product_id = p["product_id"]
@product.save
end
不幸的是我收到了这个错误:
NoMethodError in Admin::ProductsController#test
undefined method `sku=' for nil:NilClass
我应该注意到我已经确认“sku”确实是Product模型的一个属性,我也尝试过重置服务器。有什么想法吗?
答案 0 :(得分:1)
编写代码的方式,@exists
总是true
所以即使sku不存在,where()方法也会返回一个空数组,其值为true
在红宝石。
在ruby中评估为false的唯一值是false
和nil
。
这就是为什么当您使用Product.find_by_sku
时,它会返回nil
,因为sku不存在,这就是您收到错误undefined method sku= for nil:NilClass
的原因。
就像你在写nil.sku = p['sku']
那样无效。
要检查数据库中是否存在记录,最好使用'exists?'方法:
if Product.exists?(["sku = ?",p["sku"]])
# product exists
else
# product doesn't exist
end
您实际上可以跳过额外的记录检查,只使用find_by_sku方法来检查是否存在并获取记录(如果它同时存在)。以下代码执行相同的操作,但它更像“类似ruby”:
@product = Product.find_by_sku(p['sku'])
@product = Product.new unless @product
@product.sku = p['sku'] # this is unnecessary
@product.name = p['name']
@product.mage_product_id = p['product_id']
@product.save