Rails 5, Devise 4.5.0 обновляют пользователя без пароля, используя пользовательский контроллер и вложенную форму - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь обновить пользователя через пользовательский контроллер с вложенной формой.Я могу создать пользователя с помощью вложенной формы, но у меня проблема с разрешением обновления пользователя без использования пароля.Я видел много других подобных сообщений, но они, кажется, используют контроллер регистрации.

В вики 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 вопроса.

  1. Почему я получаю ошибки и не могу обновить пользователя?
  2. Почему :id будет передано в user_attributes при первом нажатии сохранения и не будет переданокогда во второй раз нажимается кнопка сохранения?
...