2010-03-25 4 views
3

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

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

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

Это не относится к Rails, поэтому я отметил его как таковой. –

ответ

10

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

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

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

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

Foo.for(facebook_id) 

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

Возможно, что часть Rails или плагин/драгоценный камень ожидает, что некоторые классы будут иметь метод класса «для». В этом отношении было бы полезно больше контекста.

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

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

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

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

Добавлено:

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

0

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

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

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

+0

Этот ответ не имеет ничего общего с вопросом, который был задан: что делает сам в этом фрагменте кода ... – severin

+0

Не обязательно. Он спросил, что это значит. Я ответил. Не нужно ниспровергать меня, потому что вы интерпретировали его вопрос по-другому. – mjaz

0

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

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

0

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

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

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

Смежные вопросы