【问题标题】:Why use "self" to access ActiveRecord/Rails model properties?为什么使用“self”来访问 ActiveRecord/Rails 模型属性?
【发布时间】:2012-04-25 00:35:12
【问题描述】:

在我的整个应用程序中,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

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

Rails 3.0.7。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 validation


    【解决方案1】:

    通常使用self 是为了强制Ruby 将其识别为方法调用,而不是将其误解为变量。如果事先不知道名为day= 的方法,那么day = "x" 在Ruby 看来就像一个变量赋值。 self.day = "x" 始终是一个方法调用。

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

    【讨论】:

    • 抱歉,self.day 应该是 self.name!我更新了问题。
    • Nit:Ruby 永远不会将x = y 当作方法调用。它始终是直接变量(或常量,取决于大小写)赋值。 x(作为表达式)的形式取决于范围内是否存在这样的x(作为变量)。
    • 如果namename=是在class文件解析后动态添加的,那么是否有name表示self.name的时候,而其他时候name是局部变量?
    • @BSeven 表达式name 表示“局部变量名”当且仅当 name 已经绑定(分配给)。在所有其他时间,它表示self.name。表达式name = y 始终是将y 赋值给变量 name。我宁愿避免使用重载名称。 obj.attr = v 始终是 setter 所必需的。 ;-)
    • Nit 2: class 在 Ruby 中并不比后来添加的动态方法更“特殊”。它只是一个表达式,不会“添加上下文”到 Ruby 以后如何处理 xx=(因为这将永远成为方法调用,即使“在 class 中定义”表达式”。)无论如何,仍然是+1,即使我发现响应在某些地方有点误导:-)
    猜你喜欢
    • 2012-06-08
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多