Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails在XML中访问数据-未定义的方法_Ruby On Rails_Ruby_Magento - Fatal编程技术网

Ruby on rails Rails在XML中访问数据-未定义的方法

Ruby on rails Rails在XML中访问数据-未定义的方法,ruby-on-rails,ruby,magento,Ruby On Rails,Ruby,Magento,我正在尝试使用位于以下位置的“Magento rb”库将产品从Magento商店下载到我的Rails数据库中: 我尝试了以下代码: 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| @

我正在尝试使用位于以下位置的“Magento rb”库将产品从Magento商店下载到我的Rails数据库中:

我尝试了以下代码:

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”确实是产品模型的一个属性,并且我还尝试重置服务器。有什么想法吗?

您编写代码的方式,
@exists
始终是
true
,因此即使sku不存在,where()方法也会返回一个空数组,在ruby中计算结果为
true

ruby中唯一计算为false的值是
false
nil

这就是为什么当您使用
Product.find\u by_sku
时,它会返回
nil
,因为sku不存在,这就是为什么您会得到错误
未定义的方法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”:


来自敖德克的你好!你需要添加。首先在where之后打电话,然后它就可以工作了。之后,您可以适当地重构代码。
@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