Rails 5,Devise 4.5.0使用自定义控制器和嵌套表单更新用户而无需密码

时间:2018-09-22 16:29:40

标签: devise ruby-on-rails-5 nested-attributes

我正在尝试通过具有嵌套表单的自定义控制器来更新用户。我可以使用嵌套表单创建用户,但是在不使用密码的情况下允许用户更新存在问题。我看到许多其他类似的帖子,但它们似乎使用了注册控制器。

Devise wiki中指出

  

默认情况下,Devise允许用户使用:registerable模块更改密码。但是有时,开发人员希望创建其他操作,以允许用户无需密码即可更改其信息。在这种情况下,最好的选择是创建属于您的应用程序的自己的控制器,并提供编辑和更新操作,就像对应用程序中的任何其他资源一样。

     

请记住,尽管限制您允许更改的参数。特别是,您可能只想允许用户数据字段,而避免更改电子邮件,密码和此类信息:

     

params(:user).permit(:first_name, :last_name, :address)

我已遵循此步骤,并且在回调中遇到了3个错误

  • 用户电子邮件不能为空
  • 用户密码不能为空
  • 用户无效

我的用户模型中没有任何验证,因此不是从那里来的,并且在强参数中也没有列出:password:password_confirmation:email。 / p>

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,而第二次单击保存时为什么不传递?

0 个答案:

没有答案