2015-10-20 38 views
2
@numbers = [1,2,3,4,5,6,7,8,9] 

    @numbers.each do |n|    

    if @order.card_type"n" != "none" 
     notes += "\n\nCard 1: " + @order.card_type1 + "\nPaper Weight: " + @order.paper_weight1 + "\nQuantity: " + @order.quantity1 + "\nInk Color #1: " + @order.ink_color11 + "\nInk Color #2: " + @order.ink_color12 + "\nWording: " + @order.wording1 + "\nReturn Address Printing: " + @order.return_address1 + "\nGuest Address Printing: " + @order.guest_address1.to_s + "\nEnvelope Liners: " + @order.envelope_liners1     
    end    

    end 

我不知道我在做什麼錯,但我需要在控制器中用1-9替換「n」。我無法找出正確的方法來做到這一點。迭代9次,我認爲我有一個語法錯誤

+0

將'@ order.card_type「n」'更改爲'@ order.try(「card_type#{n}」)1 ='none'' – MrYoshiji

+0

不相關,但更喜歡字符串插值連接。我可能也會收集這些字符串並加入它們以創建最終的「筆記」值。 –

回答

1

有一些問題在這裏。

第一,已經解決了,是你需要一個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的數字的數組,並使用它來訪問所有其他字段)。

+0

哇!感謝這麼徹底和冗長的答覆。我將研究這個並將其實施到我的代碼中。這麼棒的學習體驗。 –

2

只是[]符號和字符串操作訪問:

(1..9).each do |n|    

    if @order["card_type#{n}"] != "none" 
    # ... 
    end    

end 

如果做不到這一點,你也可以這樣做:

@order.send("card_type#{n}") 
+0

我收到未定義的方法'[]'錯誤?我錯過了什麼。 –

+0

@CraigRinde「@ order」是'nil'。你可以做'@ order.inspect'併發布你的輸出嗎? – sjagr

+0

嘗試'@ order.send(「card_type#{n}」)' – wspurgin

相關問題