Rails:before_save, либо создать, либо обновить запись и вернуть false?

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Есть форма, в которой есть 1 поле, адрес электронной почты.

  1. При отправке модель вызывает:before_save
  2. Проверяет, существует ли адрес электронной почты.
    1. Если это произойдет, это создаст новую запись.
    2. Если это не так, это обновляет запись в другой модели, и запись не должна создаваться.

Использование 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. Часто я нахожу, когда вы так сильно боретесь с зерном фреймворка, что делаете что-то не так. Возможно ли вместо этого изменить вашу логику или настройку модели?