Ruby/Rails中如何获取类方法call的返回值?
解决Ruby/Rails中获取MyClass.call返回值的问题
嘿,别担心,新手遇到这类问题太正常了!我帮你梳理下可能的问题点和解决办法:
核心问题分析
你现在的代码有两个关键问题导致拿不到正确的content_id:
call是实例方法,但你用类直接调用了:你写的def call是实例方法,需要先创建MyClass的实例才能调用,但你现在直接用MyClass.call(...)调用类方法,这会导致方法找不到或者执行逻辑异常。- 方法没有正确接收传入的参数:你的方法里直接用了
context.params,但context变量根本没定义——你调用时传的是params:和current_user:,但方法没有接收这些参数,自然无法生成正确的context,业务逻辑也就跑不对,返回的content_id肯定有问题。
具体解决步骤
方案1:把call改成类方法(推荐,匹配你的调用方式)
修改MyClass的定义,给call方法加上self.变成类方法,同时接收传入的关键字参数,并封装成你需要的context:
class MyClass # 加上self.,让它成为类方法,支持MyClass.call直接调用 def self.call(params:, current_user:) # 把传入的参数封装成context对象,这里用OpenStruct方便你像原来那样用.调用属性 context = OpenStruct.new(params: params, current_user: current_user) category_id = context.params['category_id'] tmp_context = context.clone # ... 你的业务处理逻辑 ... content_id # Ruby方法默认返回最后一行的结果,确保这里是你要返回的内容 end end
然后调用的时候直接接收返回值即可:
# 把返回值赋值给变量,就能拿到content_id了 target_content_id = MyClass.call(params: params, current_user: current_user)
方案2:保持实例方法,修改调用方式
如果你不想改方法定义,那调用时需要先实例化MyClass:
class MyClass # 保持实例方法不变,但要添加参数接收 def call(params:, current_user:) context = OpenStruct.new(params: params, current_user: current_user) category_id = context.params['category_id'] tmp_context = context.clone # ... 你的业务处理逻辑 ... content_id end end # 先创建实例,再调用call方法 my_class_instance = MyClass.new target_content_id = my_class_instance.call(params: params, current_user: current_user)
额外检查点
- 确保你的业务逻辑里确实正确生成了
content_id,没有提前return其他值,也没有把content_id变量覆盖成nil。 - 如果
params是Rails的强参数对象,确认category_id确实存在于params中(可以用params[:category_id]或params['category_id']验证)。
内容的提问来源于stack exchange,提问作者Angelica Rosa
相关产品推荐
相关产品推荐

