Javascript 未初始化的常量Spree::Api::AramexAddressController::AramexAddressValidator

Javascript 未初始化的常量Spree::Api::AramexAddressController::AramexAddressValidator,javascript,ruby-on-rails,ruby,spree,aramex,Javascript,Ruby On Rails,Ruby,Spree,Aramex,我面临以下问题: ActionController::RoutingError(未初始化的常量Spree::Api::AramexAddressController::AramexAddressValidator): app/controllers/spree/api/aramex\u address\u controller.rb:2:in app/controllers/spree/api/aramex\u address\u controller.rb:1:in 我在我的controlle

我面临以下问题:

ActionController::RoutingError(未初始化的常量Spree::Api::AramexAddressController::AramexAddressValidator):
app/controllers/spree/api/aramex\u address\u controller.rb:2:in

app/controllers/spree/api/aramex\u address\u controller.rb:1:in

我在我的controllers/spree/api/aramex_address_controller.rb中包括以下内容:

我在assets/javascripts/spree/frontend/checkout/address.JS中包含了提交的Aramex Ajax验证的以下JS调用:

Spree.ready(函数($){
Spree.onAddress=函数(){
var call_aramex=真;
$(“#结帐#表格(地址)”)。在('submit',函数(e)上{
如果($('#签出表单地址').valid()){
var s#U country=$(“#订单#发货#地址#属性#国家#id”).find('option:selected').attr('iso#代码');
var s#u zipcode=$(“#order_ship_address_attributes_zipcode”).val();
var s#u city=$(“#order#ship#address_attributes#city”).val();
var b_country=$(“#订单(账单)地址(属性)国家(id)”).find('option:selected').attr('iso_代码');
var b#u zipcode=$(“#order#u bill_address_attributes_zipcode”).val();
var b_city=$(“#order_bill_address_attributes_city”).val();
如果(调用aramex==true&&(aramex国家类型!='undefined')&&(aramex国家。包括(b_国家)| aramex_国家。包括(s_国家))){
e、 预防默认值();
var error_id=$('#errorexplainion')。是(':visible')?'#errorexplainion':'#手动_error'
$(错误id).html(“”.hide()
$.blockUI({
消息:“”
});
$.ajax({
url:“/api/validate\u address\u with\u aramex”,
键入:“GET”,
数据类型:“json”,
数据:{
s_国家:s_国家,
s_zipcode:s_zipcode,
苏城:苏城,
b_国家:b_国家,
b_zipcode:b_zipcode,
b_市:b_市,
使用账单地址:($(“#订单(使用账单”)。是(“:选中”))
},
成功:功能(结果){
$.unbui()
if(result.b|u错误| result.s|u错误){
如果(结果b_错误){
$(错误id).append('billingaddress'+result.b_errors+'')
}
如果(结果s_错误){
$(错误id).append('Shipping Address'+result.s\u errors+'')
}
如果((result.b_errors&&!result.s_errors)&&($(“#order_use_billing”)。为(“:unchecked”)){
$(“.js摘要编辑”).trigger(“单击”)
}
$(错误id).show();
$('html,body')。设置动画({
滚动顶部:“0px”
}, 300);
}否则{
call_aramex=false;
$('#签出\表格\地址')。提交()
}
},
错误:函数(xhr、状态、错误){
$(error\u id).append('Oops出现问题,但您可以处理订单')
$(错误id).show();
$.unbui()
$('html,body')。设置动画({
滚动顶部:“0px”
}, 300);
$('#签出\表格\地址')。提交()
}
});
}
}
})
var getCountryId,订单使用计费,更新发货表单状态;
如果($('checkout_form_address')。是('*')){
($('#签出\表单\地址')。验证({
规则:{
“订单[账单地址属性][城市]”:{
要求:正确,
maxlength:函数(元素){
返回maxCharLimit($(“#订单#账单#地址#属性#国家#id”).val(),22)
}
},
“订单[账单地址属性][名字]”:{
要求:正确,
maxlength:函数(元素){
返回maxCharLimit($(“#订单#账单#地址#属性#国家#id”).val(),15)
}
},
“订单[账单地址属性][姓氏]”:{
要求:正确,
maxlength:函数(元素){
返回maxCharLimit($(“#订单#账单#地址#属性#国家#id”).val(),17)
}
},
“订单[票据地址属性][address1]”:{
要求:正确,
maxlength:函数(元素){
返回maxCharLimit($(“#订单#账单(地址)属性(国家)id”).val(),32)
}
},
“订单[账单地址属性][地址2]”:{
maxlength:函数(元素){
返回maxCharLimit($(“#订单#账单(地址)属性(国家)id”).val(),32)
}
},
“命令
class Spree::Api::AramexAddressController < ApplicationController
  include AramexAddressValidator

  # fetch cities from aramex api
  def fetch_cities_from_aramex_address
    response = []
    zones = Spree::ShippingMethod.where(['LOWER(admin_name) like ?', '%aramex%']).map(&:zones).flatten
    if zones.map(&:countries).flatten.map(&:iso).include?(params['country_code'])
      response = JSON.parse(fetch_cities(params['country_code']))['Cities']
    end
    respond_to do |format|
      format.json { render :json => response, :status => 200 }
    end
  end

  # Validate address for aramex shipping
  def validate_address_with_aramex
    begin
      zones = Spree::ShippingMethod.where(['LOWER(admin_name) like ?', '%aramex%']).map(&:zones).flatten
      final_response = {}
      if zones.map(&:countries).flatten.map(&:iso).include?(params[:b_country])
        final_response[:b_errors] = confirm_address_validity(params[:b_city], params[:b_zipcode], params[:b_country])
      end
      if zones.map(&:countries).flatten.map(&:iso).include?(params[:s_country]) && params[:use_bill_address] == "false"
        final_response[:s_errors] = confirm_address_validity(params[:s_city], params[:s_zipcode], params[:s_country])
      end
    rescue
      return true
    end
    respond_to do |format|
      format.json { render :json => final_response, :status => 200 }
    end
  end

  # Confirm address validity with Aramex address validatio API
  def confirm_address_validity(city, zipcode, country)
    response = JSON.parse(validate_address(city, zipcode, country))
    if response['HasErrors'] == true
      if response['SuggestedAddresses'].present?
        response['Notifications'].map{|data| data['Message']}.join(', ') + ', Suggested city name is - ' + response['SuggestedAddresses'].map{|data| data['City']}.join(', ')
      else
        if response['Notifications'].first['Code'] == 'ERR06'
          response['Notifications'].map{|data| data['Message']}.join(', ')
        else
          cities_response = JSON.parse(fetch_cities(country, city[0..2]))
          cities_response['Notifications'].map{|data| data['Message']}.join(', ') + ', Suggested city name is - ' + cities_response['Cities'].join(' ,')
        end
      end
    end
  end
end
get 'validate_address_with_aramex', to: 'aramex_address#validate_address_with_aramex'
get 'fetch_cities_from_aramex_address', to: 'aramex_address#fetch_cities_from_aramex_address'
Spree.ready(function($) {
    Spree.onAddress = function() {
        var call_aramex = true;
        $("#checkout_form_address").on('submit', function(e) {
            if ($('#checkout_form_address').valid()) {
                var s_country = $("#order_ship_address_attributes_country_id").find('option:selected').attr('iso_code');
                var s_zipcode = $("#order_ship_address_attributes_zipcode").val();
                var s_city = $("#order_ship_address_attributes_city").val();
                var b_country = $("#order_bill_address_attributes_country_id").find('option:selected').attr('iso_code');
                var b_zipcode = $("#order_bill_address_attributes_zipcode").val();
                var b_city = $("#order_bill_address_attributes_city").val();
                if (call_aramex == true && (typeof aramex_countries !== 'undefined') && (aramex_countries.includes(b_country) || aramex_countries.includes(s_country))) {
                    e.preventDefault();
                    var error_id = $('#errorExplanation').is(':visible') ? '#errorExplanation' : '#manual_error'
                    $(error_id).html("").hide()
                    $.blockUI({
                        message: '<img src="/assets/ajax-loader.gif" />'
                    });
                    $.ajax({
                        url: "/api/validate_address_with_aramex",
                        type: 'GET',
                        dataType: "json",
                        data: {
                            s_country: s_country,
                            s_zipcode: s_zipcode,
                            s_city: s_city,
                            b_country: b_country,
                            b_zipcode: b_zipcode,
                            b_city: b_city,
                            use_bill_address: ($("#order_use_billing").is(":checked"))
                        },
                        success: function(result) {
                            $.unblockUI()
                            if (result.b_errors || result.s_errors) {
                                if (result.b_errors) {
                                    $(error_id).append('<div>Billing Address ' + result.b_errors + ' </div>')
                                }
                                if (result.s_errors) {
                                    $(error_id).append('<div>Shipping Address ' + result.s_errors + ' </div>')
                                }
                                if ((result.b_errors && !result.s_errors) && ($("#order_use_billing").is(":unchecked"))) {
                                    $(".js-summary-edit").trigger("click")
                                }
                                $(error_id).show();
                                $('html, body').animate({
                                    scrollTop: '0px'
                                }, 300);
                            } else {
                                call_aramex = false;
                                $('#checkout_form_address').submit()
                            }
                        },
                        error: function(xhr, status, error) {
                            $(error_id).append('Oops Something Went Wrong but you can process order')
                            $(error_id).show();
                            $.unblockUI()
                            $('html, body').animate({
                                scrollTop: '0px'
                            }, 300);
                            $('#checkout_form_address').submit()
                        }
                    });
                }
            }
        })

        var getCountryId, order_use_billing, update_shipping_form_state;
        if (($('#checkout_form_address')).is('*')) {
            ($('#checkout_form_address')).validate({
                rules: {
                    "order[bill_address_attributes][city]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 22)
                        }
                    },
                    "order[bill_address_attributes][firstname]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 15)
                        }
                    },
                    "order[bill_address_attributes][lastname]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 17)
                        }
                    },
                    "order[bill_address_attributes][address1]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 32)
                        }
                    },
                    "order[bill_address_attributes][address2]": {
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 32)
                        }
                    },
                    "order[bill_address_attributes][zipcode]": {
                        maxlength: function(element) {
                            return maxCharLimit($("#order_bill_address_attributes_country_id").val(), 10)
                        }
                    },
                    "order[ship_address_attributes][city]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 22)
                        }
                    },
                    "order[ship_address_attributes][firstname]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 15)
                        }
                    },
                    "order[ship_address_attributes][lastname]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 17)
                        }
                    },
                    "order[ship_address_attributes][address1]": {
                        required: true,
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 32)
                        }
                    },
                    "order[ship_address_attributes][address2]": {
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 32)
                        }
                    },
                    "order[ship_address_attributes][zipcode]": {
                        maxlength: function(element) {
                            return maxCharLimit($("#order_ship_address_attributes_country_id").val(), 10)
                        }
                    }
                }
            });
            getCountryId = function(region) {
                return $('#' + region + 'country select').val();
            };

            isCountryUsOrCa = function(country_id) {
                return ["38", "232"].includes(country_id)
            }

            maxCharLimit = function(country_id, limit) {
                if (["38", "232"].includes(country_id)) {
                    return limit;
                } else {
                    return 255;
                }
            };

            Spree.updateState = function(region) {
                var countryId;
                var cityId
                countryId = getCountryId(region);
                if (countryId != null) {
                    if (region == 'b') {
                        cityId = '#order_bill_address_attributes_city'
                        countryInputId = "#order_bill_address_attributes_country_id"
                    } else {
                        cityId = '#order_ship_address_attributes_city'
                        countryInputId = "#order_ship_address_attributes_country_id"
                    }
                    fill_cities($(countryInputId).find('option:selected').attr('iso_code'), cityId)
                    if (Spree.Checkout[countryId] == null) {
                        return $.get(Spree.routes.states_search, {
                            country_id: countryId
                        }, function(data) {
                            Spree.Checkout[countryId] = {
                                states: data.states,
                                states_required: data.states_required
                            };
                            return Spree.fillStates(Spree.Checkout[countryId], region);
                        });
                    } else {
                        return Spree.fillStates(Spree.Checkout[countryId], region);
                    }
                }
            };

            fill_cities = function(country_code, cityId) {
                $.ajax({
                    url: "/api/fetch_cities_from_aramex_address",
                    type: 'GET',
                    dataType: "json",
                    data: {
                        country_code: country_code
                    },
                    success: function(data) {
                        $(cityId).autocomplete({
                            source: data,
                        });
                    },
                    error: function() {}
                });
            }

            Spree.fillStates = function(data, region) {
                var selected, stateInput, statePara, stateSelect, stateSpanRequired, states, statesRequired, statesWithBlank;
                statesRequired = data.states_required;
                states = data.states;
                statePara = $('#' + region + 'state');
                stateSelect = statePara.find('select');
                stateInput = statePara.find('input');
                stateSpanRequired = statePara.find('[id$="state-required"]');
                if (states.length > 0) {
                    selected = parseInt(stateSelect.val());
                    stateSelect.html('');
                    statesWithBlank = [{
                        name: '',
                        id: ''
                    }].concat(states);
                    $.each(statesWithBlank, function(idx, state) {
                        var opt;
                        opt = ($(document.createElement('option'))).attr('value', state.id).html(state.name);
                        if (selected === state.id) {
                            opt.prop('selected', true);
                        }
                        return stateSelect.append(opt);
                    });
                    stateSelect.prop('disabled', false).show();
                    stateInput.hide().prop('disabled', true);
                    statePara.show();
                    stateSpanRequired.show();
                    if (statesRequired) {
                        stateSelect.addClass('required');
                    }
                    stateSelect.removeClass('hidden');
                    return stateInput.removeClass('required');
                } else {
                    stateSelect.hide().prop('disabled', true);
                    stateInput.show();
                    if (statesRequired) {
                        stateSpanRequired.show();
                        stateInput.addClass('required');
                    } else {
                        stateInput.val('');
                        stateSpanRequired.hide();
                        stateInput.removeClass('required');
                    }
                    statePara.toggle(!!statesRequired);
                    stateInput.prop('disabled', !statesRequired);
                    stateInput.removeClass('hidden');
                    return stateSelect.removeClass('required');
                }
            };
            ($('#bcountry select')).change(function() {
                $('label.error').hide()
                if (isCountryUsOrCa($("#order_bill_address_attributes_country_id").val())) {
                    $('#checkout_form_address').valid();
                }
                return Spree.updateState('b');
            });
            ($('#scountry select')).change(function() {
                $('label.error').hide()
                if (isCountryUsOrCa($("#order_bill_address_attributes_country_id").val())) {
                    $('#checkout_form_address').valid();
                }
                return Spree.updateState('s');
            });
            Spree.updateState('b');
            order_use_billing = $('input#order_use_billing');
            order_use_billing.change(function() {
                return update_shipping_form_state(order_use_billing);
            });
            update_shipping_form_state = function(order_use_billing) {
                if (order_use_billing.is(':checked')) {
                    ($('#shipping .inner')).hide();
                    return ($('#shipping .inner input, #shipping .inner select')).prop('disabled', true);
                } else {
                    ($('#shipping .inner')).show();
                    ($('#shipping .inner input, #shipping .inner select')).prop('disabled', false);
                    return Spree.updateState('s');
                }
            };
            return update_shipping_form_state(order_use_billing);
        }
    };
    return Spree.onAddress();
});