如何处理 has_many 关联的accepts_nested_attributes_for 的参数,该关联在两个关联表上都包含很多字段

问题描述 投票:0回答:1

我有一个与建筑模型有 has_many 关联的用户模型。最初,我使用 user.create 和 user.buildings.create 分别创建用户和建筑物,因为表中有一些字段,如果该字段为 true,则只有它创建建筑物,并且在建筑物中也存在条件如果建筑物中的条件字段为真,则更多字段数据将添加到建筑物中。一切都运行得很顺利,直到用户创建了一个建筑物。但是当用户开始创建更多建筑时,代码就会崩溃。 下面是users_controller的代码

def create
      role = Role.find_by(id: params[:user][:role_id])
      if role.nil?
        render json: { error: 'invalid role' }, status: :unprocessable_entity
      else
        user = User.new(user_params)
        user.role_id = role.id
        ActiveRecord::Base.transaction do
          if user.save
            # If the user is a technician, handle equipment_params
            if role.name.downcase == 'technician'
              equipment_ids = params[:user][:equipment_id]
              handle_technician_params(user, equipment_ids)
            end
            # If the user is a customer, handle customer_params
            if role.name.downcase == 'customer'
              handle_customer_params(user)
            end
            # Generate a new authentication token for the user
            token, refresh_token = generate_tokens(user.id)
            render json: {  message: 'User created successfully', authentication_token: token, user: user, meta: {photos: UserSerializer.new(user) }}, status: :ok
          else
            render json: { errors: user.errors.full_messages }, status: :unprocessable_entity
          end
        end
      end
    end
def handle_customer_params(user)
      if user_params[:is_customer_direct_point_of_contact] == 'true'
        handle_building_params(user)
      else
        handle_service_params(user)
      end
    end

    def handle_building_params(user)
      building_params = params.require(:building).permit(:service_address_line1, :service_address_line2, :service_zip_code, service_images: [])
      building = user.buildings.create(building_params)
    end
    def handle_service_params(user)
      service_params = params.require(:building).permit(:service_address_line1, :service_address_line2, :service_zip_code, :name, :phone_number, :email, :tax_id, service_images: [])
      building = user.buildings.create(service_params)
    end

我尝试将其更改为使用accepts_nested_attributes_for直接创建用户和构建,但不明白如何做到这一点。 还有其他方法吗?

ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 rubygems
1个回答
0
投票

这里有很多非常基本的东西可以清理。这些包括诸如应该在模型中而不是控制器中完成的测试值之类的事情 - user.technician?应该是一个模型方法。但要侧面解决您的具体问题:

  1. 确定测试框架
  2. 将“accepts_nested_attributes”添加到您的用户模型中
  3. 编写一些添加各种用户和建筑物的请求测试,直到正确为止。

请勿尝试应用程序中的功能 - 编写测试将使您成为更好的编码员并使代码库更好,并且您将能够更快地迭代和学习。

https://guides.rubyonrails.org/testing.html#function-tests-for-your-controllers

我建议使用 Guard 进行高迭代测试: https://github.com/guard/guard

© www.soinside.com 2019 - 2024. All rights reserved.