Rails Console创建Currency对象触发ArgumentError参数错误求助
问题根源&解决方案
兄弟,你踩了一个新手常犯的坑——把实例相关的属性和方法全定义成类级别的了!
看你的代码,所有逻辑都包在class << self里面,这意味着attr_accessor :input_value, :currency_iso是类属性(整个Currency类共用一份),而不是每个实例独有的。当你执行Currency.new(100, "CAD")时,Ruby会调用实例的initialize方法,但你既没定义实例级别的initialize,默认的initialize又不接受任何参数,所以直接抛出ArgumentError。
修正后的代码
class Currency # 实例属性:每个Currency对象都有自己的input_value和currency_iso attr_accessor :input_value, :currency_iso # 类常量:放在类级别没问题,所有实例共享 USD_ISO = "USD" USD_TO_DM = 2.8054 # 实例初始化方法:接收参数并赋值给当前对象的属性 def initialize(input_value, currency_iso) @input_value = input_value @currency_iso = currency_iso end # 实例方法:对外暴露的转换接口 def converted_value convert_to_dm end private # 私有实例方法:实际执行转换逻辑 def convert_to_dm # 可以加个判断:只处理USD转DM的情况(根据你的需求调整) if currency_iso == USD_ISO input_value / USD_TO_DM else # 非USD的情况可以抛错或返回原值,按需调整 raise "Only USD can be converted to DM" end end end
关键修正点说明
- 移除
class << self包裹:把属性和方法从类级别改成实例级别,让每个Currency.new出来的对象都有自己独立的属性值 - 添加
initialize方法:明确接收两个参数,给当前实例的属性赋值 - 调整方法作用域:让
converted_value和convert_to_dm成为实例方法,这样它们能访问当前对象的input_value和currency_iso - 补充逻辑判断:给转换逻辑加了简单的合法性校验(可选,你可以根据实际需求修改)
验证效果
在rails console里执行:
c = Currency.new(100, "USD") c.converted_value # 会返回 100 / 2.8054 的计算结果
这下就不会再报参数错误啦!
内容的提问来源于stack exchange,提问作者miner27
相关产品推荐
相关产品推荐

