2017-02-23 59 views
0

嗨,我试图创建一个runescape项目的模型。使用那里api和httparty。我有很多问题。但是这个是关于使用覆盖初始化方法的说法,它说明它的参数数量是错误的。Rails 5模型初始化错误的参数数量?

class Item < ApplicationRecord 
    require 'json' 
    include HTTParty 


    base_uri 'http://services.runescape.com/m=itemdb_oldschool/' 


    attr_accessor :name, :description, :price, :icon_url 


    def initialize(name, description, price, icon_url) 
    super 
    self.name = name 
    self.description = description 
    self.price = price 
    self.icon_url = icon_url 
    end 


    def self.find(name) 
    response = get("/api/catalogue/detail.json?item=#{name}") 
    if response.success? 
     parsed = JSON.parse(response) 
     self.new(
     parsed["item"]["name"], 
     parsed["item"]["description"], 
     parsed["item"]["current"]["price"], 
     parsed["item"]["icon_large"] 
    ) 
    else 
     # this just raises the net/http response that was raised 
     raise response.response 
    end 
    end 
end 

所以在导轨控制台I运行下面的命令,以测试它:

item_test = Item.find( “227”)

ArgumentError: wrong number of arguments (given 4, expected 0..1) 
    from /Users/jacksharville/.rvm/gems/ruby-2.3.1/gems/activerecord-5.0.1/lib/active_record/core.rb:312:in `initialize' 
    from /Users/jacksharville/Desktop/OSCRUDDY/app/models/item.rb:13:in `initialize' 
    from /Users/jacksharville/.rvm/gems/ruby-2.3.1/gems/activerecord-5.0.1/lib/active_record/inheritance.rb:65:in `new' 

但初始化需要4个参数。当它减少到一个然后它说它需要4.这让我很困惑。

我甚至不确定覆盖基础初始化是如何做这样的事情。所以,如果你有更好的主意,请让我知道我是新手。

总之我的问题是为什么我的对象没有被正确创建?其次,这是创建对象的正确方法吗?

回答

0

我在这里看到的问题是,你试图在HTTPartyActiveRecord的子类中混合使用,当时你应该有两个独立的类。 Item类应该负责连接数据库。您应该创建另一个班级,即ItemResourceHttparty,这将负责连接到Runescape资源并响应回复。您应该使用此功能从资源中获取数据,并使用该数据创建一个记录ItemSingle Responsibility Principle

有一点要记住的是,对于从ApplicationRecord继承的任何型号,几乎不应该重新定义initialize。检出API

编辑 此代码应该让你比较接近

#app/models/item.rb 
class Item < ApplicationRecord; end 

#app/models/item_resource.rb | app/resources/item_resource.rb or something similar 
require 'json' 
class ItemResource 
    include HTTParty 

    self.base_uri 'http://services.runescape.com/m=itemdb_oldschool/' 

    def find name 
    response = get("/api/catalogue/detail.json?item=#{name}") 

    if response.success? 
     parsed = JSON.parse(response) 
     Item.new(
     name: parsed["item"]["name"], 
     description: parsed["item"]["description"], 
     price: parsed["item"]["current"]["price"], 
     icon_large: parsed["item"]["icon_large"] 
    ) 
    else 
     raise response.response 
    end 
    end 
end 

#somewhere else 

item = ItemResource.find 'Elysian Spirit Shield' 
if item.save 
    #do stuff 
else 
    #handle failure 
end 
+0

说实话我真的不要求这些数据都保存到数据库中。但是我所要做的就是再次执行一些检查,并对它进行一些数学运算。所以删除解决了这个问题间接回答了我的问题,谢谢! – Morphasis

+0

@Morphasis欢呼队友。 – Sean

+0

让我知道如果你有任何关于红宝石或osrs的东西,我可以帮忙:) – Sean

相关问题