2017-02-23 56 views
0

Привет, я пытаюсь создать модель для элемента runescape. Использование там api и httparty. У меня есть ряд проблем. Но это касается использования переопределения метода инициализации, говорящего, что у него неправильное количество аргументов.Rails 5 model Инициализировать неправильное количество аргументов?

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' 

Но Initialize принимает 4 аргумента. Когда уменьшите его до одного, тогда он говорит, что ему требуется 4. Который оставляет меня очень смущенным.

Я даже не уверен, что переопределение базовой инициализации - это путь вперед, чтобы сделать что-то вроде этого. Поэтому, если у вас есть лучшая идея, пожалуйста, дайте мне знать, что я новичок в этом.

В заключение мой вопрос: почему мой объект не создается правильно? Во-вторых, это правильный подход для создания объекта?

ответ

0

Проблема, которую я вижу здесь, заключается в том, что вы пытаетесь смешивать HTTParty с подклассом ActiveRecord, когда на самом деле у вас должно быть два отдельных класса. Класс Item должен отвечать за взаимодействие с вашей базой данных. Вы должны создать другой класс, то есть ItemResource с Httparty, который будет обязан подключиться к ресурсу Runescape и ответить ответом. Вы должны использовать это, чтобы захватить данные из ресурса и создать запись Item с этими данными. Single Responsibility Principle

Следует иметь в виду, что вы почти не должны переопределять initialize для любых моделей, которые наследуют от ApplicationRecord. Оформить заказ 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

Чтобы быть честным, я действительно не требуют, чтобы сохранить эти данные в базу данных на всех. Но все, что мне нужно сделать, это запустить некоторые проверки снова api и сделать некоторые математики против него. Так что удаление, которое разрешило проблему, косвенно ответили на мой вопрос, спасибо! – Morphasis

+0

@Morphasis приветствует помощника. – Sean

+0

Сообщите мне, если у вас есть что-то еще относительно рубина или osrs, с которыми я могу помочь :) – Sean