Rails以XML格式访问数据 - 未定义的方法

时间:2014-10-15 09:57:16

标签: ruby-on-rails ruby magento

我正在尝试使用位于此处的“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模型的一个属性,我也尝试过重置服务器。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

编写代码的方式,@exists总是true所以即使sku不存在,where()方法也会返回一个空数组,其值为true在红宝石。

在ruby中评估为false的唯一值是falsenil

这就是为什么当您使用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