2015-10-20 87 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

相关问题