#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
Есть форма, в которой есть 1 поле, адрес электронной почты.
- При отправке модель вызывает:before_save
- Проверяет, существует ли адрес электронной почты.
- Если это произойдет, это создаст новую запись.
- Если это не так, это обновляет запись в другой модели, и запись не должна создаваться.
Использование return false для отмены before_save для 2.2, но оно откатывает обновление и отменяет создание, когда я просто хочу, чтобы запись не создавалась.
Я на правильном пути? Есть ли лучший способ?
Ответ №1:
Странно, что вы получили объект пользователя A, но обновили строку пользователя B……
Может быть, вы могли бы сначала найти правильный пользовательский объект в контроллере:
@user = User.find_by_email(params[:email]) || User.new(params[:email])
User.find_by_xxx
вернет nil, если не сможет найти соответствующий объект (или вернет первый объект, если совпадают два или более объектов).
Комментарии:
1. Это не поможет, я на самом деле обновляю совершенно другую модель. Для чего я это делаю, так это для привилегий. Если кто-то еще не является участником, он сохраняет свои права до тех пор, пока они не присоединятся. Привилегии сохраняются в объекте, на который они получают права при присоединении.
Ответ №2:
Вы могли бы просто создать свой собственный эквивалент метода before_save и вызвать его вместо object.save
например.
def custom_save
if email_address_exists? # this would be a method you create
self.save
else
# update record in other model
end
end
Затем в вашем контроллере используйте это вместо сохранения (т.е.. model.custom_save)
Комментарии:
1. Я не думаю, что это решение будет работать, если запись сохраняется через вложенную модель. Какие-либо другие рекомендации?
2. Часто я нахожу, когда вы так сильно боретесь с зерном фреймворка, что делаете что-то не так. Возможно ли вместо этого изменить вашу логику или настройку модели?