我正在尝试通过具有嵌套表单的自定义控制器来更新用户。我可以使用嵌套表单创建用户,但是在不使用密码的情况下允许用户更新存在问题。我看到许多其他类似的帖子,但它们似乎使用了注册控制器。
在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个问题。
:id
中传递user_attributes
,而第二次单击保存时为什么不传递?