【问题标题】:Rails update one to one and one to many - create child object if not existRails 更新一对一和一对多 - 如果不存在则创建子对象
【发布时间】:2015-10-08 14:09:42
【问题描述】:

我有三个模型:EmployeeUserRole。这些类之间的关系是employee --- one_to_one -- useruser -- one_to_many -- role

我的创建操作在使用以下强大的参数方法时运行良好

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

【问题讨论】:

  • 您似乎没有将新的用户记录保存给我。
  • 可能在实例化新用户之后,你也应该通过调用@employee.user.save 来保存它
  • 好的。我希望更新和保存发生在同一个事务中。

标签: ruby-on-rails ruby controller


【解决方案1】:

我认为正如上述用户所建议的,您需要保存新的用户对象,但我认为您应该在 Employee create 中包含用户创建代码,因为无论如何您都需要在更新中自动创建它

不确定您是否也知道 helpers 空白?,现在?但我用那个重写了你的代码

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

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多