新手问题 Ruby 中传参的问题

mrrocket · 2020年11月30日 · 最后由 mrrocket 回复于 2020年12月01日 · 427 次阅读

大家好,我是其他语言转过来的,最近在研究 ruby,目前在传参这里碰到了难题,其他语言调用参数很简单,都是通过 fn(arg1,arg2) fn(arg1,arg2){ //do something}来调用的,但是如果在 ruby 中这样调用就会出问题,我的 arg1 参数是 ActionController::Parameters 类型,但是在 fn 接受参数后,参数类型变成了 array 类型,请问我需要怎么做,才能保持参数类型不变?

代码如下: issues_controller.rb:

def  build_new_child_issue_from_parent
    ...
    do something
    ...
    logger.info(" issue_attributes.class.name => #{issue_attributes.class.name}")
    #log日志中:issue_attributes.class.name => ActionController::Parameters
    @issue_develop_action.safe_attributes= issue_attributes, User.current, type
end

issue.rb

def safe_attributes=(attrs, user=User.current, type='father')
     logger.info("attrs.class.name  => #{attrs.class.name}")   #log日志中:attrs.class.name => Array
     ...
     do something
     ...
end

现在 build_new_child_issue_from_parent 中 issue_attributes.class.name 是 ActionController::Parameters,在 safe_attributes 中 attrs.class.name 是 Array

估计你参数是 *arg1

show US the code ma

确实有点奇怪,除非用了语法糖合并或者拆解了参数,不然传进来连 object_id 都不会变,类型更加不会变了

提供一个可能引起变化的思考,你在代码调用时省略圆括号,这里 Ruby 在调用时解析应该是出现了和你理解不一致的行为。 括号加上再试下?

@issue_develop_action.safe_attributes=(issue_attributes, User.current, type)

@theblock24block 没有,我的最新代码已经贴上了。我后来在 controller 中换成把 type 赋值给 session,

session[:type] = type

报错 undefined local variable or method `session' ,也不知道什么情况

Rei 回复

非常感谢,刚刚试了下,确实是你说的这样。

mrrocket 回复

去掉 =,不用 setter 方法

def safe_attributes(attrs, user=User.current, type='father')
     logger.info("attrs.class.name  => #{attrs.class.name}")   #log日志中:attrs.class.name => Array
     ...
     do something
     ...
end

另外注意 user=User.current 有隐患,默认值不用简单类型而是线程变量可能会有 bug,曾经默认值的计算时机变动过一次。

Rei 回复

好的,我再尝试一下,thank U :)

mrrocket 关闭了讨论。 12月01日 14:29
需要 登录 后方可回复, 如果你还没有账号请 注册新账号