我有一个与建筑模型有 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直接创建用户和构建,但不明白如何做到这一点。 还有其他方法吗?
这里有很多非常基本的东西可以清理。这些包括诸如应该在模型中而不是控制器中完成的测试值之类的事情 - user.technician?应该是一个模型方法。但要侧面解决您的具体问题:
请勿尝试应用程序中的功能 - 编写测试将使您成为更好的编码员并使代码库更好,并且您将能够更快地迭代和学习。
https://guides.rubyonrails.org/testing.html#function-tests-for-your-controllers
我建议使用 Guard 进行高迭代测试: https://github.com/guard/guard