2015-10-07 79 views
0

enter image description hereRuby on Rails的:迭代语法错误

我试图让这个循环在cardtype结束迭代数。我无法弄清楚正确的语法。我尝试了一堆不同的东西。

请参阅红色箭头。

+4

一个很好的提示,可以帮助他人在将来帮助您,将您的代码粘贴到问题和错误消息中。 – gernberg

+4

以字符形式发布代码,而不是图片。 – sawa

+0

感谢您的意见 –

回答

3

如果你真的做这样你可以使用的方法来发送,以这样的方式

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

这将执行法“cardtype#{N}”的@order对象。

但是,这通常不是最好的想法,我建议你考虑将此属性转换为has_many关系或可序列化数组。

退房协会是如何工作的本教程(这是最有可能要使用什么):(?数据库列)http://guides.rubyonrails.org/association_basics.html

+1

同意!你也可以迭代''1..9]。每个都做'而不是@数字,但是最好的办法是制作一个单独的卡片模型,纸张的重量,类型和数量作为字段在卡片上,然后只是'@ order.cards.each do | card | ' - 看起来你正在学习铁轨,祝你好运! – court3nay

+0

我认为截至目前我的理解是有缺陷的。我是新来的铁轨,现在我只是想让这个代码给我发电子邮件的细节。现在该信息来自用户提交的表单,用户最多可以有9张卡片。他们只能选择1张卡,如果他们想,我只想。在电子邮件中,我不想显示所有信息,所以我正在尝试使用此设置。后来一旦我了解更多,我想添加更多的用户有许多卡类型设置的发烧友结构。 –

+0

感谢[1..9]技巧。 –

1

据我了解,cardtypeN是一种方法,其中N是一个整数。这意味着没有简单的方法来遍历这些属性为Ruby虚拟机本身这些方法都没有联系,即使你给他们打电话cardtype1cardtype2对方,等

而事实上,你的代码突出显示了非常糟糕的设计决定给我。如果一个订单可以有更多的卡片类型,那么您应该确实需要一个卡片模型,并将订单和卡片与一对多关系相关联。

然而,要回答你的问题,你可以动态地组合使用下列方法之一方法:

# [] syntax 
@order["cardtype#{n}"] 
# send 
@order.send("cardtype#{n}") 

每种方法都有自己的优点和缺点。说到这里,你可以循环从1到最大cardtypes

<% 1.to(10).each do |index| %> 
    <% if @order["cardtype#{index}"] != "none" %> 
    whatever 
    <% end %> 
<% end %> 

的数量然而,正如我所说,你真的想重新设计你的模型。

+1

'[]'符号确实读得好多了。值得注意的是,您对糟糕的设计决策的评论来源于违反软件设计的[Zero,One或Infinity Rule](https://en.wikipedia.org/wiki/Zero_one_infinity_rule)。这似乎是'has_many'关系的一个很好的候选人,而不是一堆列。 – tadman

+0

@tadman我同意'has_many',这就是为什么我强调它。我真的觉得拥有索引值的方法名是一种可怕的方法。 –

+0

感谢有关零无限规则的信息。我会研究has_many。我认为我的理解还没有完成,我一直在黑客攻击。 –