Создание метода log
Скажем, у вас есть класс User
, и в классе, вы определяете метод has_cell_phone
. (Содержание этого метода не имеет значения.) Когда вы определяете метод в классе как def has_cell_phone
, этот метод можно вызвать на любом объекте User
. В то время как class User
сам по себе является объектом класса, вы бы назвали его объектом, ближайшим классом которого является User
. В правильных выражениях вы бы написали метод экземпляра для экземпляра класса User
.
Вы получаете эту ошибку, потому что метод log
, который вы определили, работает только для _instance класса ActivityLog
.Если вы выполните следующие действия, вы можете позвонить log
правильно, учитывая ваш текущий код:
activity_log = ActivityLog.create # with required params
activity_log.log
Во-вторых, вы вызываете log
с параметрами, в то время как ваше определение метод не требует каких-либо. (Это будет выглядеть как def log(params)
.)
Теперь здесь вы можете изменить существующий код. Если вы хотите вызвать метод на всем классе (что означает сам класс), вы добавляете ключевое слово self
в определение класса. Например, для класса User
это будет def self.create_user_with_cell_phone
. Вы также можете добавить аргументы к этому методу. Аргументы вы предоставите в вашей линии «вызов метода», я хотел бы добавить те к вашему методу класса, например, так:
def self.log(instance_id, action)
# ...
end
ActivityLog.log(1, 'create')
Вам не нужно будет включать user_id
, потому что, основываясь на вашей логике, он проверяет, Объект current_user
- true
, и следует оттуда.
Создание класса постоянной
Второй взгляд на ваш вопрос, я обнаружил, что вы определяете метод actions
. Помните, что я сказал о методах экземпляра? Поскольку кажется, что actions
всегда будет оставаться постоянным, я рекомендую вам сделать его одним! Чтобы сделать это, рекомендуется поместить следующую строку в свой класс перед любыми определениями методов.
ACTIONS = ['start','stop','create','destroy']
Тогда, в любое время вы хотите позвонить ACTIONS
в то время как внутри ActivityLog
класса, вы сделали следующее: ACTIONS.index(action)
. Если вы хотите назвать эту константу за пределами своего класса, вы бы сделали это: ActivityLog::ACTION
. Это аналогичный синтаксис вызова метода класса, вместо этого вы используете ::
, чтобы отделить класс от константы. Пересматривая код, он должен выглядеть следующим образом:
class ActivityLog < ActiveRecord::Base
ACTIONS = ['start','stop','create','destroy']
validates :user_id, :instance_id, :action, presence: true
validates :user_id, :instance_id, :action, numericality: true
def self.log(instance_id, action)
ActivityLog.create(
user_id: (current_user ? current_user.id : -1),
instance_id: instance_id,
action: ACTIONS.index(action)
)
end
end
вам нужно определить метод as'self.log', чтобы сделать его как метод класса –