2017-02-23 64 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

相關問題