Всякий раз, когда вы получаете сообщение об ошибке undefined для класса nil, это должно быть немедленным сигналом для вас, что проблема - это переменная, на которую вы вызываете метод, а не метод, который вы вызываете. Другими словами, поскольку он говорит, что nil
не имеет метода update
, ваш фокус должен быть на переменной, которая фактически равна нулю. Вопрос здесь: почему invite
возвращает nil
вместо отношений?
Поскольку вы используете собственный метод класса для создания отношений, я предполагаю, что вы не говорите ему, чтобы он возвращал правильный объект. Он должен выглядеть примерно так:
def self.create_invitation(event, user, something_else = nil)
rel = InvitationRel.new(from_node: event, to_node: user)
if rel.save
rel
else
# return an error, maybe rel.errors.full_messages?
end
end
Затем вашему контроллеру необходимо проверить правильность создания rel.
event = Event.find(params[:event])
invite = Invite.create_invitation(event, current_user, nil) #creates relationship
if invite.neo_id.nil?
# the rel did not create correctly, neo_id is only present on persisted objects
else
invite.update(interested: params[:interest])
end
Это кажется мне, как будто вы проделаете долгий путь по этой проблеме. Вам не нужно, чтобы отделить создание отношений и установление interested
собственности, вы можете просто сделать это в один вызов к БД:
event = Event.find(params[:event])
invite = InviteRel.new(from_node: event, to_node: current_user, interested: params[:interest])
if invite.save?
# rel was created, move on
else
# something wrong in the rel, figure out what it was
end
Поскольку вы знаете, что вы всегда будете создавать что interested
недвижимость , это выглядит как хорошее место для добавления проверки вашей модели, чтобы гарантировать, что свойство всегда задано для создания.
Спасибо, Крис. Ruby обычно возвращает последний объект. Если вы просто имели 'InvitationRel.new (from_node: event, to_node: user) .save' Мне интересно, почему этот объект отношения не возвращается. Зачем нам явно возвращать его? Есть ли тонкое творение, о котором я не знаю? – Clam
'save' не возвращает объект, на который он вызван, он возвращает логическое значение того, был ли объект сохранен или успешно сохранен. 'create' возвращает объект, но не указывает, был ли он успешным. Вот почему вы повсюду видите шаблон 'if obj.save then do_this else do_that end'. – subvertallchris