Rails:何时使用self

时间:2010-03-25 03:29:42

标签: ruby-on-rails ruby syntax

我正在开发Rails应用程序,并希望了解何时使用self.for

以下是我想要完全理解的方法的代码。如果有可能,我希望有一个替代这个代码,这样可以使事情更清楚。

def self.for(facebook_id)
  User.create_by_facebook_id(facebook_id)
end

4 个答案:

答案 0 :(得分:10)

self 指的是当前对象。

在一个类中,self用于定义类级方法。

class Foo
  def self.for(facebook_id)
    User.create_by_facebook_id(facebook_id)
  end
end

在类Foo中定义的类方法。它被调用:

Foo.for(facebook_id)

您可以谷歌获取课程方法以了解更多信息。

可能是Rails或插件/ gem的一部分期望某些类将具有“for”类方法。更多上下文在这方面会有所帮助。

该方法正在做什么

正如类方法所常见的那样,它正在创建一个类的实例。例如,ActiveRecord类有一个类方法“create”,它尝试创建已存储在数据库中的模型类的实例。因此,User.create将返回已存储在数据库中的User类的实例。

在您的示例代码中,它调用应用程序中User类提供的类方法“create_by_facebook_id”。

看起来“for”方法被用于信息隐藏,因为它所做的只是进行另一个方法调用(到User.create_by_facebook)

添加了:

顺便说一下,R​​uby方法的默认返回值是最后一个语句的值。因此,您的示例方法将返回从提供的facebook_id新创建的用户实例。

答案 1 :(得分:0)

在我看来,self.for只是为facebook id创建用户的别名。我认为self.for应该是:

def self.for(facebook_id)
  User.find_or_create_by_facebook_id(facebook_id)
end

这样它会搜索具有该facebook id的用户,如果找不到,则创建该记录并将其返回。然后,self.for表示“返回用户获取此facebook ID。”

答案 2 :(得分:0)

简答:自我总是指当前对象。因此,在一个实例方法中,self是实例,在类方法中,self是类,在类定义中(如在您的示例中),self是类......

有关课程方法和您发布的代码段的详细信息,请参阅Larry K的答案。

答案 3 :(得分:0)

如果该代码位于名为Foo的类中,则替代方法可以是:

def Foo.for(facebook_id)
  User.create_by_facebook_id(facebook_id)
end
如果您希望能够在多个类中使用某些通用的类级别方法,则必须在此上下文中使用

self。您使用Module将它们添加到self.以限定它们(因为您不知道它们将成为其中一部分的实际类的名称),然后将该模块作为您的一部分包含在内类。