Rails: когда использовать себя - PullRequest
3 голосов
/ 25 марта 2010

Я занимаюсь разработкой приложения на Rails и хотел бы понять, когда использовать self.for.

Вот код метода, который я хотел бы полностью понять. Если это возможно, я бы хотел иметь альтернативу этому коду, чтобы было понятнее.

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

Ответы [ 4 ]

10 голосов
/ 25 марта 2010

self относится к текущему объекту.

Внутри класса self используется для определения метода уровня класса.

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

определяет метод класса для в классе Foo. Вызывается:

Foo.for(facebook_id)

Вы можете узнать методы класса в Google, чтобы узнать больше.

Возможно, часть Rails или плагин / гем ожидает, что у некоторых классов будет метод класса "for". В этом отношении было бы полезно больше контекста.

Что делает метод

Как обычно для методов класса, он создает экземпляр класса. Например, класс ActiveRecord имеет метод класса «create», который пытается создать экземпляр класса модели, который был сохранен в базе данных. Таким образом, User.create вернет экземпляр класса User, который был сохранен в базе данных.

В вашем примере кода он вызывает метод класса "create_by_facebook_id", который предоставляется классом User в приложении.

Похоже, что метод "for" используется для сокрытия информации, поскольку все, что он делает, - это вызывает другой метод (для User.create_by_facebook)

Добавлено:

Кстати, возвращаемое значение по умолчанию из методов Ruby - это значение последнего оператора. Таким образом, ваш пример метода вернет новый пользовательский экземпляр из предоставленного facebook_id.

0 голосов
/ 25 марта 2010

Если этот код находится внутри класса с именем Foo, то альтернативой может быть:

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

self в этом контексте необходимо, если у вас есть несколько общих методов уровня класса, которые вы хотите использовать в нескольких классах. Вы добавляете их в Module, используя self. для их охвата (поскольку вы не знаете имя фактического класса, в который они входят), а затем включаете этот модуль как часть вашего класса. *

0 голосов
/ 25 марта 2010

Краткий ответ: self всегда относится к текущему объекту. Таким образом, в методе экземпляра self является экземпляром, в методе класса self является классом, а в определении класса (как в вашем примере) self является классом ...

Дополнительную информацию о методах класса и фрагменте кода, который вы разместили, см. В ответе Ларри К.

0 голосов
/ 25 марта 2010

Мне кажется, что self.for - это просто псевдоним для создания пользователя для идентификатора facebook. Я думаю, что self.for должно быть:

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

Таким образом он ищет пользователя с таким идентификатором facebook, а если он не найден, создает эту запись и возвращает ее. Затем self.for означает «вернуть пользователя с этим идентификатором facebook».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...