Rails 5模型初始化错误的参数数量?
问题描述:
嗨,我试图创建一个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.这让我很困惑。
我甚至不确定覆盖基础初始化是如何做这样的事情。所以,如果你有更好的主意,请让我知道我是新手。
总之我的问题是为什么我的对象没有被正确创建?其次,这是创建对象的正确方法吗?
答
我在这里看到的问题是,你试图在HTTParty
和ActiveRecord
的子类中混合使用,当时你应该有两个独立的类。 Item类应该负责连接数据库。您应该创建另一个班级,即ItemResource
与Httparty
,这将负责连接到Runescape资源并响应回复。您应该使用此功能从资源中获取数据,并使用该数据创建一个记录Item
。 Single 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
说实话我真的不要求这些数据都保存到数据库中。但是我所要做的就是再次执行一些检查,并对它进行一些数学运算。所以删除解决了这个问题间接回答了我的问题,谢谢! – Morphasis
@Morphasis欢呼队友。 – Sean
让我知道如果你有任何关于红宝石或osrs的东西,我可以帮忙:) – Sean