Вы почти на месте:
def rate_component_params
params.require(:tax_rate_component).permit(
components: [:name, :rate]
)
end
Когда вы передаете массив символов, Rails разрешит га sh с этими ключами. В Rails также есть встроенный метод создания вложенных записей из параметров, а именно ActiveRecord::NestedAttributes
. Например:
class TaxRate < ApplicationRecord
has_many :tax_rate_components
accepts_nested_attributes_for :tax_rate_components
end
Это создает сеттер с именем tax_rate_component_attributes=
, который принимает массив хэшей и создает записи. Он также решает множество проблем с вашим решением, таких как оборачивание всего этого в одну транзакцию и обновление / удаление.
Если ваш API «заблокирован» и вы не можете изменить подпись, вы можете измените параметры или создайте специальный установщик так, чтобы они передавались в установщик вложенных атрибутов.
def rate_params
params.permit(
:name,
tax_rates_component: {
components: [:name, :rate]
}
).tap do |p|
attrs = p.dig(:tax_rate_component, :components)
if attrs
p[:tax_rate_component_attributes] = attrs
p.delete(:tax_rate_component)
end
end
end
С этим вы можете избавиться от всего create_tax_rate_components
boondoggle.
def create
tax_rate = @organisation.tax_rates.new(rate_params)
if tax_rate.save
render json: tax_rate, include: [:tax_rate_components]
else
head :unprocessable_entity # or whateveer
end
end