迭代9次,我认为我有语法错误

时间:2015-10-20 20:46:10

标签: ruby-on-rails ruby

 #Persistent
 #Include %A_ScriptDir%
 #SingleInstance force
 #NoEnv
 SetWorkingDir %A_ScriptDir%
 SetTitleMatchMode, 1
 SetKeyDelay, 150, 150, Play
 SetControlDelay,0
 iffut:="FUT"
 SetTimer,datos,10
 return

 datos:
 IfWinExist,DataTable ahk_class #32770
  {
    WinGetTitle,winname,DataTable   
    StringTrimLeft,winname,winname,11
    IfInString,winname,%iffut%
      {
        StringTrimRight,winname,winname,8
      }

    ControlGet,dato,List,,SysListView321,DataTable

    StringReplace, dato, dato, %A_Tab%, `,, All   
    StringReplace, dato, dato, %A_Space%, `,, All 
    IfInString,dato,%iffut%
      {
        ;MsgBox,there
         StringReplace, dato, dato, .{5}FUT, , All
      }

    FormatTime, mydttm, , ddMMyy_HHmmss
    FileAppend,%dato%,%winname%_%mydttm%.txt

    return
  }

我不确定我做错了什么,但我需要更换" n"在我的控制器中使用1-9。我无法找到正确的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

只需使用userInput.length()表示法和字符串操作访问它:

Integer.parseInt("" + userInput.charAt(i))

如果做不到这一点,你也可以这样做:

[]

答案 1 :(得分:1)

这里有很多问题。

第一个已经解决的问题是,您需要send来访问该值:

if @order.send(:"card_type#{n}") != "none" ...

第二个是字符串中的每个单独元素也以数字命名:

Card 1: #{@order.card_type1}

现在你将在整个循环中使用相同的值,因此你需要使用send

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

第三,你可以使用heredoc清理巨大的字符串concat:

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

请注意,我设置为“none”的订单项不会出现。

现在,我对命名(不知道你的域名)采取了自由,并且你需要进行各种调整(比如...为什么在Rails应用程序中生成文本输出),但这显示了一条可能的路径您可以采取清理代码,并减少理解主线代码所需的思考量。

即使您没有将订单项分开并坚持使用数字命名的订单属性,您仍然可以隔离令人困惑的代码以提取基于数字的属性,找出哪些是必要的(例如,旋转卡片类型并获取不是none的数字数组,并使用它来访问所有其他字段。

相关问题