var*_*tis 69 ruby-on-rails self ruby-on-rails-3 ruby-on-rails-3.1
问题:我什么时候需要在Rails的模型中使用self?
我的一个set模型中有一个方法.
class SomeData < ActiveRecord::Base
def set_active_flag(val)
self.active_flag = val
self.save!
end
end
Run Code Online (Sandbox Code Playgroud)
当我这样做,一切正常.但是,当我这样做时:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
save!
end
end
Run Code Online (Sandbox Code Playgroud)
active_flag值不会更改,而是静默失败.谁能解释一下?
我找不到任何副本,但如果有人发现一个也没关系.
DVG*_*DVG 64
当您在调用方法的实例上执行操作时,您使用self.
有了这段代码
class SocialData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
save!
end
end
Run Code Online (Sandbox Code Playgroud)
您正在定义一个名为active_flag的全新范围的局部变量,将其设置为传入的值,它与任何东西都没有关联,因此当方法结束时它会立即丢失,就像它从未存在过一样.
self.active_flag = val
Run Code Online (Sandbox Code Playgroud)
但是告诉实例修改自己的名为active_flag的属性,而不是一个全新的变量.这就是它的原因.
Yuv*_*rmi 57
这是因为范围界定.当你在一个方法内,并尝试设置一个像这样的新变量:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
end
end
Run Code Online (Sandbox Code Playgroud)
您正在创建一个存在于set_active_flag内的全新变量.一旦完成执行,它就会消失,而不self.active_flag是以任何方式改变(实际的实例变量).
但是(这对我来说是一个混乱的来源):当你尝试在ruby中读取一个实例变量时,如下所示:
class SomeData < ActiveRecord::Base
def whats_my_active_flag
puts active_flag
end
end
Run Code Online (Sandbox Code Playgroud)
你实际上会得到self.active_flag(实际的实例变量).
原因如下:
Ruby会尽其所能避免返回nil.
active_flag存在于whats_my_active_flag?范围内?active_flag这个范围内确实存在吗?但是,如果您active_flag在其中定义whats_my_active_flag,然后请求它,它将再次执行以下步骤:
active_flag存在于whats_my_active_flag?范围内?在任何一种情况下,除非您明确告诉它,否则它不会更改值self.active_flag.
描述这种行为的一种简单方法是"它不想让你失望"并返回nil- 所以它尽力找到它能做到的一切.
同时,"它不想搞乱你不打算改变的数据",因此它不会改变实例变量本身.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
26664 次 |
| 最近记录: |