Как посмотреть, проверить, существует ли модель, и создать, если ее нет с одной формой?
Я пытаюсь реализовать форму со следующим поведением:
1) Введите некоторые семантические данные о пользователе (т.е. имя пользователя). 2) Сделайте User.find_by(:username = username). 3) Если такой пользователь существует, сразу показать страницу для этого пользователя. 4) Если такого пользователя не существует, создайте нового пользователя с предоставленным именем пользователя, а затем перенаправьте на страницу показа для этого пользователя.
Это должно быть просто, но я не могу понять, как отформатировать помощник form_for и мое шоу и создать действия в моем user_controller для реализации этого поведения.
В настоящее время у меня есть:
form_with: url => 'users /: id',: method =>: get do... end
потому что я в конечном итоге пытаюсь вызвать метод "show" контроллера. Тем не менее, моя форма не принимает идентификатор пользователя в качестве параметра, и когда пользователь еще не существует, отсутствует параметр: id для доступа во время отправки формы.
Как я могу настроить свою форму для перенаправления на показ в каждом случае, при этом придерживаясь логики, описанной выше?
2 ответа
Вы можете сделать что-то подобное в вашем действии создания контроллера пользователя.
def create
usr_name = params[:username]
@user = User.where(username: usr_name).first_or_initialize
if @user.persisted?
redirect_to user_path(@user) # or whatever your user show path is
elsif @user.save
redirect_to user_path(@user)
else
render :new
end
end
Вам просто нужно убедиться, что вы проверяете уникальность имен пользователей.
Также, first_or_initialize
(и его аналог first_or_create
) можно взять в блоке. Таким образом, вы можете назначить другие атрибуты новому пользователю, как это...
User.where(username: usr_name).first_or_initialize do |usr|
usr.some_attribute = some_value
end
Вы можете использовать find_or_initialize_by(unique_key) в вашем методе create.unique_key может быть любым ключом, который вы используете для идентификации вашего пользователя, таким как электронная почта, телефон и т. д.