2017-02-23 5 views
0

こんにちは、私はrunescape項目のモデルを作成しようとしています。 apiとhttpartyを使用しています。私にはいくつかの問題があります。しかし、これは引数の数が間違っていると言って、initializeメソッドをオーバーライドすることの使用に関するものです。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 

だからレールコンソールで、私はそれをテストするには、次のコマンドを実行します。

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つの引数を取ります。それを1に減らすと、それは4が必要だと言います。それは私を非常に混乱させてしまいます。

私は基本的な初期化をオーバーライドすることが、このようなことをする方法であることは確かでもありません。だからあなたが良いアイデアを持っているなら、私はこれについて新しいことを教えてください。

結論として、なぜ私のオブジェクトが正しく作成されていないのですか?第二に、これはオブジェクトを作成するための正しいアプローチですか?

答えて

0

私がここに見る問題は、HTTPartyActiveRecordサブクラスにミックスしようとしていることです。実際には2つの別々のクラスが必要です。 Itemクラスは、データベースとのインタフェースを担当する必要があります。別のクラス(ItemResourceHttparty)を作成する必要があります。これはRunescapeリソースに接続して応答する責任があります。これを使用してリソースからデータを取得し、そのデータでItemレコードを作成する必要があります。 Single Responsibility Principle

ApplicationRecordを継承するモデルの場合は、initializeを再定義することはほとんどありません。チェックアウトAPI

EDIT このコードは、正直に言うと、あなたに

#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

関連する問題