Как посмотреть, проверить, существует ли модель, и создать, если ее нет с одной формой?

Я пытаюсь реализовать форму со следующим поведением:

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

Другие вопросы по тегам