2017-02-23 5 views
0

Hallo, ich versuche ein Modell für ein Runencape-Objekt zu erstellen. Verwenden Sie dort API und httparty. Ich habe eine Reihe von Problemen. Aber diese bezieht sich auf die Verwendung der Initialisierungsmethode, die besagt, dass sie die falsche Anzahl von Argumenten hat.Modell Rails 5 Falsche Anzahl von Argumenten initialisieren?

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 

So in Schienen-Konsole ausführen i den folgenden Befehl, es zu testen:

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' 

Aber die initialize dauert 4 Argumente. Wenn es auf eins reduziert wird, dann sagt es, dass es 4 erfordert. Was mich sehr verwirrt.

Ich bin nicht einmal sicher, dass das Überschreiben der Basisinitialisierung der Weg nach vorne ist, um so etwas zu tun. Wenn Sie also eine bessere Idee haben, lassen Sie mich bitte wissen, dass ich neu bin.

Abschließend ist meine Frage warum wird mein Objekt nicht korrekt erstellt? Zweitens ist dies der richtige Ansatz zum Erstellen des Objekts?

Antwort

0

Das Problem, das ich hier sehe, ist, dass Sie versuchen, HTTParty mit einer Unterklasse zu mischen, wenn Sie wirklich zwei separate Klassen haben sollten. Die Item-Klasse sollte für die Verbindung mit Ihrer Datenbank zuständig sein. Sie sollten eine weitere Klasse erstellen, d. H. ItemResource mit Httparty, die dafür verantwortlich ist, eine Verbindung mit der Runescape-Ressource herzustellen und mit einer Antwort zu antworten. Sie sollten dies verwenden, um die Daten aus der Ressource abzurufen und einen Datensatz mit diesen Daten zu erstellen. Single Responsibility Principle

Eine Sache zu beachten ist, dass Sie fast nie initialize für alle Modelle neu definieren, die von ApplicationRecord erben. Kasse der API

EDIT Dieser Code sollten Sie relativ nahe kommen

#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

Um ehrlich zu sein ich wirklich überhaupt nicht benötigen diese Daten in einer Datenbank zu speichern. Aber alles, was ich tun muss, ist, ein paar Kontrollen gegen die API zu machen und etwas Mathe dagegen zu machen. Also das Entfernen, das das Problem indirekt gelöst hat, hat meine Frage dankend beantwortet! – Morphasis

+0

@ Morphisis Prost Mate. – Sean

+0

Lass es mich wissen, wenn du etwas anderes über Ruby oder Osrs hast, mit dem ich helfen kann :) – Sean

Verwandte Themen