Я пытаюсь обновить пользователя через пользовательский контроллер с вложенной формой.Я могу создать пользователя с помощью вложенной формы, но у меня проблема с разрешением обновления пользователя без использования пароля.Я видел много других подобных сообщений, но они, кажется, используют контроллер регистрации.
В вики Devise указано
По умолчанию Devise позволяет пользователям изменять свой пароль с помощью модуля :registerable
.Но иногда разработчики хотят создавать другие действия, которые позволяют пользователю изменять свою информацию, не требуя пароля.Лучшим вариантом в этом случае является создание собственного контроллера, который принадлежит вашему приложению, и предоставление действий по редактированию и обновлению, как вы бы делали для любого другого ресурса в вашем приложении.
Однако имейте в виду, чтобудьте ограничены в параметрах, которые вы можете изменить.В частности, вы, вероятно, хотите разрешить только поля данных пользователя и избегать изменения адреса электронной почты, пароля и такой информации:
params(:user).permit(:first_name, :last_name, :address)
Я следовал этому, иЯ получаю 3 ошибки в моем обратном вызове
- Адрес электронной почты пользователя не может быть пустым
- Пароль пользователя не может быть пустым
- Пользователь недействителен
У меня нет никаких проверок в моей пользовательской модели, поэтому она не оттуда, и у меня нет :password
, :password_confirmation
или :email
, перечисленных в сильных параметрах.
user.rb
#The only validations in my user model are :first_name and :last_name
validates_presence_of :first_name, :last_name
caregiver.rb
extend FriendlyId
friendly_id :agency_and_full_name, :use => [:slugged, :finders]
belongs_to :user, inverse_of: :caregivers
accepts_nested_attributes_for :user
validates_associated :user
def agency_and_full_name
[[self.agency.agency_name, self.user.first_name, self.user.last_name]]
end
caregivers_controller.rb
def update
if caregiver_params[:user_attributes][:password].blank?
params = caregiver_update_without_password_params
else
params = caregiver_params
end
respond_to do |format|
if @caregiver.update(params)
format.html { redirect_to @caregiver, notice: 'Caregiver updated.' }
format.json { render :show, status: :ok, location: @caregiver }
else
format.html { render :edit }
format.json { render json: @caregiver.errors, status: :unprocessable_entity }
end
end
end
private
def caregiver_update_without_password_params
params.require(:caregiver).permit(:field1, :field2,
user_attributes: [:first_name, :middle_name, :last_name])
end
def caregiver_params
params.require(:caregiver).permit(:field1, :field2,
user_attributes: [:first_name, :middle_name, :last_name,
:email, :password, :password_confirmation])
end
_form.html.haml
= form_with model: @caregiver, local: true do |f|
= f.fields_for :user, @caregiver.user do |u|
передаваемые параметры
Parameters: {"utf8"=>"✓", "authenticity_token"=>"lpYRS7vmq5C002bqP6rE8QU3i8wFc7sY0Qaff369v9X7GyjcRDTuKEx7F6whiC+9g4tsUBrAhLlu64iyghHPZA==",
"caregiver"=>{"user_attributes"=>{"id"=>"3", "first_name"=>"Mickey",
"middle_name"=>"Mark", "last_name"=>"Mouse"}, "field1"=>"Foo",
"field2"=>"bar"}, "commit"=>"Submit", "id"=>"agency-a-mickey-mouse"}
Я заметил, что также получаюошибка для unpermitted parameter :id
, когда я публикую ее в первый раз.После обратного вызова и получения ошибок я заметил, что :id
в user_attributes
был удален, и нет ошибки unpermitted parameter
.Тем не менее, я все еще получаю 3 ошибки, указанные выше.
параметры передаются после повторной попытки сохранения
Parameters: {"utf8"=>"✓", "authenticity_token"=>"lpYRS7vmq5C002bqP6rE8QU3i8wFc7sY0Qaff369v9X7GyjcRDTuKEx7F6whiC+9g4tsUBrAhLlu64iyghHPZA==",
"caregiver"=>{"user_attributes"=>{"first_name"=>"Mickey",
"middle_name"=>"Mark", "last_name"=>"Mouse"}, "field1"=>"Foo",
"field2"=>"bar"}, "commit"=>"Submit", "id"=>"agency-a-mickey-mouse"}
Так что, думаю, у меня есть 2 вопроса.
- Почему я получаю ошибки и не могу обновить пользователя?
- Почему
:id
будет передано в user_attributes
при первом нажатии сохранения и не будет переданокогда во второй раз нажимается кнопка сохранения?