有一些問題在這裏。
第一,已經解決了,是你需要一個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
不相關,但更喜歡字符串插值連接。我可能也會收集這些字符串並加入它們以創建最終的「筆記」值。 –