有一些问题在这里。
第一,已经解决了,是你需要一个send
访问值:
if @order.send(:"card_type#{n}") != "none" ...
第二是每个字符串中的各个元素也都是用数字命名:
Card 1: #{@order.card_type1}
现在你将使用整个循环相同的值,所以你需要使用send
:
#{@order.send(:"card_type#{n}")}
第三,你可以清理极大的相字符串连接使用定界符:
if @order.send(:"card_type{n}") != "none"
notes += <-EOS
Card 1: #{@order.card_type1}
Paper Weight: #{@order.paper_weight1}
Quantity: #{@order.quantity1}
Ink Color #1: #{@order.ink_color11}
Ink Color #2: #{@order.ink_color12}
Wording: #{@order.wording1}
Return Address Printing: #{@order.return_address1}
Guest Address Printing: #{@order.guest_address1.to_s}
Envelope Liners: #{@order.envelope_liners1}
EOS
end
四,而不是做到这一点,首先使用的集合,并且在一些辅助方法抛出会显著清理您的主线代码。我在这里使用PORO,但同样的机制适用。
我假设某种订单项目。为简洁起见,我缩短了属性的数量:
class OrderItem
attr_accessor :type, :wording
def initialize(type, wording)
@type = type
@wording = wording
end
def valid_item?
type != 'none'
end
def item_info
<<-EOS
Card Type: #{type}
Wording: #{wording}
EOS
end
end
订单由这些项目的集合组成。 (您可以限制以各种方式九,这不是体现在这里。)
class Order
attr_accessor :items
def initialize(items)
@items = items
end
def valid_items
items.find_all &:valid_item?
end
end
在Rails应用程序的每个部分都会ActiveRecord的模式,存储在数据库中。
为了模仿我手动创建它们,并确保一个订单有"none"
类型:
items = 4.times.collect { |n| OrderItem.new('not none', "wording #{n}") }
items[2].type = 'none'
order = Order.new(items)
要获得包含非“无”类型订单的相关信息的字符串:
output = order.valid_items.collect(&:item_info).join("\n--\n")
如果您打印出来:
Card Type: not none
Wording: wording 0
--
Card Type: not none
Wording: wording 1
--
Card Type: not none
Wording: wording 3
注意我设置为订单项目“没有”不会出现。
现在,我已经习惯于命名(不知道你的域名),还有你需要做的各种调整(比如......为什么要在Rails应用程序中生成文本输出),但是这显示了一种可能可以用来清理代码的路径,并减少理解主线代码所需的思路。
即使您没有分离订单商品并坚持使用数字命名的订单属性,仍然可以隔离混淆代码以提取基于数字的属性,找出哪些是必要的(例如,旋转通过卡类型并获得不是none
的数字的数组,并使用它来访问所有其他字段)。
将'@ order.card_type“n”'更改为'@ order.try(“card_type#{n}”)1 ='none'' – MrYoshiji
不相关,但更喜欢字符串插值连接。我可能也会收集这些字符串并加入它们以创建最终的“笔记”值。 –