如何修改Ruby代码实现邮编前缀匹配以隐藏周日配送费率
问题解决方案
你的代码替换include?为start_with?后没生效,核心原因是PostCodeIdentifier类里的触发条件类型不匹配:初始化时把符号类型的trigger_when转成了小写字符串,但match?方法的case判断用的是符号,导致永远走else分支返回false,根本没执行到前缀判断的逻辑。
修改后的完整代码
# ============ PostCodeIdentifier ======================== class PostCodeIdentifier def initialize(code_trigger) @codes = code_trigger[:codes].map(&:downcase) # 去掉符号转字符串的操作,保持原符号类型 @trigger_when = code_trigger[:trigger_when] end def match?(post_code) case @trigger_when when :matches # 替换include?为start_with?,实现前缀匹配逻辑 return true if @codes.any? {|code| post_code.downcase.start_with?(code)} when :does_not_match return true unless @codes.any? {|code| post_code.downcase.start_with?(code)} else return false end end end # ============ PostCodeHideRateCampaign ================= class PostCodeHideRateCampaign def initialize(post_code_triggers) @post_code_triggers = post_code_triggers end def run(cart, shipping_rates) return unless cart.shipping_address.zip @post_code_triggers.each do |post_code_trigger| post_code_identifier = PostCodeIdentifier.new(post_code_trigger) if post_code_identifier.match?(cart.shipping_address.zip) shipping_rates.delete_if do |rate| rate.name.downcase.include?(post_code_trigger[:rate_to_hide_trigger].downcase) end end end end end # ========================================== DO NOT SHOW ========================================== POST_CODE_TRIGGERS_1 = [ {codes: [ 'AB33' , 'AB34' , 'AB35' , 'AB36' , 'AB37' , 'AB38' , 'AB39' , 'AB40' , 'AB41' , 'AB42' , 'AB43' , 'AB44' , 'AB45' , 'AB46' , 'AB47' , 'AB48' , 'AB49' ], rate_to_hide_trigger: 'SUNDAY', trigger_when: :matches }, ] CAMPAIGNS = [ PostCodeHideRateCampaign.new( POST_CODE_TRIGGERS_1 ) ] CAMPAIGNS.each do |campaign| campaign.run(Input.cart, Input.shipping_rates) end # ========================================== END POSTCODE RESTRICTIONS ==========================================
关键修改点说明
修复条件匹配逻辑:
原代码中@trigger_when = code_trigger[:trigger_when].downcase会把传入的符号(比如:matches)转成字符串"matches",但case when判断的是符号:matches,导致分支完全不匹配,直接返回false。现在去掉.downcase操作,保持符号类型,让条件判断正常触发。替换前缀判断方法:
把post_code.downcase.include?(code)改成post_code.downcase.start_with?(code),实现"邮编以指定值开头"的判断逻辑,替代原来的"邮编包含指定值"。保留大小写兼容处理:
依然对邮编和触发码做了.downcase转换,确保无论用户输入的邮编是大写还是小写,都能正确匹配列表中的前缀。
内容的提问来源于stack exchange,提问作者AltoExyl
相关产品推荐
相关产品推荐

