это Клара здесь :)
Итак, я вижу некоторые проблемы с вашим кодом, но кажется, что некоторые вещи уже работают, и это хорошо. Так что это создание нового пользователя и после этого перенаправления на нужную форму, где вы редактируете пользователя, я прав? (Просто спрашиваю, потому что я не вижу перенаправления от формы регистрации устройства к пользователю # edit).
В вашем контроллере приложений есть эта строка, которая не нужна: devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :bio])
Вы бы только необходимо разрешить дополнительные параметры для формы устройства, если вы добавите их непосредственно в форму регистрации устройства. Но здесь вы добавляете новую форму.
Итак, как мы можем обработать новую форму? Проблема в вашем коде очень тонкая. Вы изменяете пользовательский объект, но вы решили использовать profiles controller
, включая профили маршрутов (но у вас также есть несколько пользовательских маршрутов). Дело в том, что в форме редактирования пользователя следующая строка определяет, куда будут отправляться HTTP-запросы, как только кто-то нажмет кнопку «Отправить».
<%= simple_form_for(@user) do |f| %>
Откройте браузер и посмотрите в режиме проверки, который генерируется html, это будет что-то вроде этого (у него будет больше вещей, но это интересная часть для нас)
<form action="/users" accept-charset="UTF-8" method="patch">
Это означает, что когда кто-то нажимает submit
, запрос HTTP PATCH делается на /users
Сейчас то, как ваши маршруты строятся в настоящее время, они не приспособлены для этого.
Таким образом, вы можете добавить новые маршруты
resources :users, only [:update]
В users_controller#update
вы можете поместить код у вас сейчас profiles_controller#update
.
Теперь это оставит нас в странной ситуации, когда часть редактирования находится в контроллере профилей, а часть обновления - в контроллере пользователей. Это можно сделать двумя способами:
- Переместить все на пользовательский контроллер. Таким образом, вы можете редактировать и обновлять маршруты для контроллера пользователя, редактировать и обновлять действия (такие же, как profile_controller # edit и #update в вашем коде) и представление. Не забудьте удалить материал в профилях, или через две недели это будет очень запутанно).
- Скажите простую форму, не go на
users_controller
, а profiles_controller
, и вы можете сохранить настройку, как у вас есть. Вы можете сделать это, добавив эту строку
simple_form_for :user, url: user_path, method: "PATCH" ```
Еще несколько замечаний:
В routes.rb
последняя строка неверна. И вместо того, чтобы определять обычные действия CRUD вручную, вы должны использовать этот синтаксис:
...
resources :users, only: [:edit, :update]
...
И в profiles controller
в действии update
, и там вам нужно изменить рендер. (Неважно, если вы оставите его там или переместите его в users_controller). Это должно быть:
if @user.save
redirect_to profiles_path(@user)
else
render "edit"
end
Когда пользователь не будет сохранен, вы хотите отобразить edit
, а не new
.
Наконец, есть один недостаток в создании двух разных формы, но я думаю, что это не очень большая проблема здесь: проверки.
Если вы хотите провести проверку, скажем, :bio
, она не будет работать с этой настройкой, которая у вас есть сейчас, потому что Пользовательский объект уже был создан при отправке формы регистрации устройства. И на этом первом этапе проверки будут проверены - так что вы не сможете проверить, была ли биография уже там или нет. Есть драгоценные камни, чтобы справиться с этим, и я также нашел эту статью для дальнейшего исследования. https://www.honeybadger.io/blog/multi-step-forms-in-rails/