@user.update_languages(参数[:language][:language1],
参数[:语言][:语言2],
参数[:语言][:语言3])
[email protected]
logger.debug“--------------LANG\u错误----------101----------------”
+语言错误。完整消息。检查
如果参数[:用户]
@user.state=params[:user][:state]
成功=成功&[email protected]
终止
logger.debug“--------------LANG\u错误------------------102--------”
+语言错误。完整消息。检查
如果lang\u错误。完整消息。空?
@user对象将错误添加到update\u lanugages方法中的lang\u errors变量中。
当我对@user对象执行保存时,我丢失了最初存储在langu errors变量中的错误
虽然我试图做的更多的是一个黑客(这似乎不起作用)。我想了解为什么变量值被洗掉了。我理解passbyreference,所以我想知道如何将值保存在该变量中而不被冲掉
其他回答都是正确的,但一位朋友让我向他解释这一点,而这实际上归结为Ruby是如何处理变量的,因此我想与他分享一些我为他写的简单图片/解释(抱歉篇幅太长,可能有些过于简单):
问题1:将新变量str赋值为'foo'时会发生什么情况
str='foo'
str.object_id#=>;2000
答:创建了一个名为str的标签,该标签指向对象'foo',在这个Ruby解释器的状态下,该对象恰好位于内存位置2000
问题2:使用=将现有变量str分配给新对象时会发生什么情况
str='bar'。点击{b |放置“bar:{b.object_id}}}bar:2002
str.object_id#=>;2002
答:标签str现在指向另一个对象
问题3:将新变量=分配给str时会发生什么情况
str2=str
str2.object_id#=>;2002
答:创建了一个名为str2的新标签,该标签指向与str相同的对象
问题4:如果str和str2引用的对象发生更改,会发生什么情况
str2.替换“baz”
str2#=>;'巴兹
str#=>;'巴兹
str.object_id#=>;2002
str2.object_id#=>;2002
答:两个标签仍然指向同一个对象,但该对象本身发生了变化(其内容已更改为其他内容)
这与原来的问题有什么关系
与第三季度/第四季度的情况基本相同;该方法获取传入它的变量/标签(str2)的私有副本(str)。它不能更改标签str指向的对象,但它可以更改它们都引用的对象的内容以包含其他内容:
str='foo'
def突变(str2)
放置“str2:#{str2.object_id}”
str2.替换“bar”
str2=‘baz’
放置“str2:#{str2.object_id}”
终止
str.object_id#=>;2004
突变(str)#str2:2004,str2:2006
str#=>;“酒吧”
str.object_id#=>;2004