You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby/Rails中如何获取类方法call的返回值?

解决Ruby/Rails中获取MyClass.call返回值的问题

嘿,别担心,新手遇到这类问题太正常了!我帮你梳理下可能的问题点和解决办法:

核心问题分析

你现在的代码有两个关键问题导致拿不到正确的content_id:

  1. call是实例方法,但你用类直接调用了:你写的def call是实例方法,需要先创建MyClass的实例才能调用,但你现在直接用MyClass.call(...)调用类方法,这会导致方法找不到或者执行逻辑异常。
  2. 方法没有正确接收传入的参数:你的方法里直接用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:43:29