[wip] Copy each calculator error

But we still have the duplicate problem.
Wait a minute, it copies them in the same format that I am copying them. So.. I don't need to copy them at all!

Now I see that we just needed the right format in the translation file.
This commit is contained in:
David Cook
2023-04-04 14:41:16 +10:00
parent f6fac018ea
commit e43a018dc7
3 changed files with 47 additions and 17 deletions

View File

@@ -4,9 +4,18 @@ module NestedCalculatorValidation
extend ActiveSupport::Concern
included do
validates_associated :calculator, message: ->(class_obj, obj) {
# Include all error messages from object
obj[:value].errors.full_messages.join("; ")
}
validate :associated_calculator
end
def associated_calculator
# Calculator errors have already been added, don't know why.
errors.each do |error|
errors.delete(error.attribute) if error.attribute.match? /^calculator./
end
# Copy errors from associated calculator to the base object, prepending "calculator." to the attribute name.
# wait a minute, that's what the messages were before! we just needed to get the translate keys right!
calculator.tap(&:valid?).errors.each do |error|
errors.import error, attribute: [:calculator, error.attribute].join('.')
end
end
end

View File

@@ -79,17 +79,17 @@ en:
orders_close_at: Close date
variant_override:
count_on_hand: "On Hand"
spree/calculator:
preferred_flat_percent: "Flat Percent"
preferred_amount: "Amount"
preferred_first_item: "First Item"
preferred_additional_item: "Additional Item Cost"
preferred_max_items: "Max Items"
preferred_minimal_amount: "Minimal Amount"
preferred_normal_amount: "Normal Amount"
preferred_discount_amount: "Discount Amount"
preferred_unit_from_list: "Unit From List"
preferred_per_unit: "Per Unit"
spree/payment_method/calculator:
preferred_flat_percent: "Calculator Flat Percent"
preferred_amount: "Calculator Amount"
preferred_first_item: "Calculator First Item"
preferred_additional_item: "Calculator Additional Item Cost"
preferred_max_items: "Calculator Max Items"
preferred_minimal_amount: "Calculator Minimal Amount"
preferred_normal_amount: "Calculator Normal Amount"
preferred_discount_amount: "Calculator Discount Amount"
preferred_unit_from_list: "Calculator Unit From List"
preferred_per_unit: "Calculator Per Unit"
errors:
messages:
calculator_preferred_value_error: "has an invalid input. Please use only numbers. For example: 10, 5.5, -20"

View File

@@ -15,7 +15,7 @@ shared_examples "a parent model that has a Calculator" do |parent_name|
context "when the associated Calculator is invalid" do
let(:invalid_parent) do
build(parent_name, calculator: Calculator::FlatRate.new(preferred_amount: "invalid"))
build(parent_name, calculator: Calculator::FlexiRate.new(preferred_first_item: "invalid"))
end
before do
@@ -28,7 +28,7 @@ shared_examples "a parent model that has a Calculator" do |parent_name|
it "adds custom error messages to base" do
error_messages = invalid_parent.errors.full_messages
expect(error_messages).to include(/^Calculator Amount has an invalid input./)
expect(error_messages).to include(/^Calculator First Item has an invalid input./)
end
it "has the correct number of errors messages" do
@@ -45,6 +45,27 @@ shared_examples "a parent model that has a Calculator" do |parent_name|
error_messages = invalid_parent.errors.full_messages
expect(error_messages).not_to include(/^Calculator preferred/)
end
context "with multiple errors" do
let(:invalid_parent) do
build(parent_name,
calculator: Calculator::FlexiRate.new(
preferred_first_item: "invalid",
preferred_additional_item: "invalid",
))
end
it "adds custom error messages to base" do
error_messages = invalid_parent.errors.full_messages
expect(error_messages[0]).to match(/^Calculator Additional Item Cost has an invalid input./)
expect(error_messages[1]).to match(/^Calculator First Item has an invalid input./)
end
it "has the correct number of errors messages" do
error_messages = invalid_parent.errors.full_messages
expect(error_messages.count).to eq 2
end
end
end
context "when number localization is enabled and the associated Calculator is invalid" do