我有三个模型:Employee
,User
和Role
。这些类之间的关系为employee
--- one_to_one - user
和user
- one_to_many - role
。
我的创建操作可以正常使用以下强大的params方法
def employee_params
params.require(:employee).permit(:first_name, :middle_name, :last_name, :email, user_attributes: [:id, role_ids:[]])
end
对于员工记录没有用户对象的更新,我实例化新用户,将其映射到员工并通过传递字符串参数调用更新。但是,更新失败并显示消息:
无法保存新的关联用户
我的更新方法代码是
def update
@employee = Employee.find(params[:id])
if params[:employee][:user_attributes] != nil && params[:employee][:user_attributes][:role_ids] != nil && ! params[:employee][:user_attributes][:role_ids].empty?
if @employee.user == nil
@employee.user = User.new
temp_password = Devise.friendly_token.first(8)
@employee.user.is_temp_password = true
@employee.user.password = Devise.friendly_token.first(8)
@employee.user.email = @employee.email
@employee.user.email = params[:employee][:email] if params[:employee][:email]
end
end
respond_to do |format|
if @employee.update(employee_params)
format.json { render json: @employee.as_json}
else
format.json {render :json => @employee.errors.as_json, :status => 422}
end
end
end
答案 0 :(得分:0)
我认为,正如上面的用户建议的那样,你需要保存新的用户对象,但我认为你应该在Employee创建中有用户创建代码,因为你需要在更新中自动创建它
不确定你是否也知道助手空白?,现在?但我用那个
重写了你的代码def update
@employee = Employee.find(params[:id])
if params[:employee][:user_attributes].present? && params[:employee][:user_attributes][:role_ids].present? && params[:employee][:user_attributes][:role_ids].present?
unless @employee.user
user = User.new
@employee.user = user
temp_password = Devise.friendly_token.first(8)
user.is_temp_password = true
user.password = Devise.friendly_token.first(8)
user.email = @employee.email
user.email = params[:employee][:email] if params[:employee][:email]
user.save!
end
end