为什么使用"self"访问ActiveRecord/Rails模型属性?

B S*_*ven 12 ruby validation ruby-on-rails ruby-on-rails-3

在我的整个申请self.中,没有必要引用用户的名字.name工作良好.

为什么以下代码需要self按预期工作?

class User< ActiveRecord::Base
    before_save :validate_name

def validate_name
    if self.name.nil? || self.name.empty?
        self.name= "Mr. No Name"
    end
end
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我知道validates_presence_of可以用来阻止保存,但如果没有给出名字,我想保存默认值.

Rails 3.0.7.

tad*_*man 23

通常使用的self是强制Ruby将其识别为方法调用而不是将其误解为变量.如果没有调用方法的先验知识day=,那么day = "x"就像Ruby一样调整Ruby.self.day = "x"总是一个方法调用.

这是麻烦的原因是因为在解析User类文件之后动态添加namename=方法.Rails在使用模型时所做的第一件事是为相关数据库字段创建方法,但这会在user.rb解析文件后发生.

  • Nit:Ruby永远不会把`x = y`作为方法调用.它始终是一个直接变量(或常量,取决于大小写)赋值.形式`x`(作为表达式)取决于范围(作为变量)中是否存在这样的"x". (7认同)
  • @BSeven表达式`name`表示"局部变量名"*当且仅当*`name`已被绑定(赋值)时.在所有其他时间它意味着`self.name`.表达式`name = y`总是将`y`赋值给*变量*`name`.我宁愿避免重载使用的名称.setter总是需要`obj.attr = v`.;-) (2认同)