如果是else或case语句帮助!

时间:2009-10-22 14:50:51

标签: ruby-on-rails if-statement case-statement

我真的可以用最好的方法来完成以下操作: 我在控制器中有以下内容(我知道这不应该在这里,需要转移到模型中)

这是一个电子邮件系统,因此根据您所处的位置,您可以通过电子邮件发送以设置人群。因此,如果您是营长等,您可以选择向下面定义的5个群组之一发送消息。如果您是公司指挥官,您的团队会发生变化。在视图中有一个下拉菜单,您可以选择邮件发送到的组。根据登录用户的位置填充选择菜单。

问题似乎是“elsif”部分没有正确填充消息。它显示正确的下拉列表,就像电子邮件已发送但电子邮件未填充一样。然而第一个值(营指挥官)工作正常。

if else语句中是否有错误写入的内容?看起来应该很简单。用户位置始终正确反映,因此不是。

if (@position == "Battalion Commander" or "Command Sergeant Major" or "FRSA" or "Battalion FRG Leader")
  @bnok = (@user.battalion.primaries).collect(&:email).select{|s| !s.blank?}.join(", ")
  @bspouses = (@user.battalion.primaries(:conditions => ["relationship = 'spouse'"])).collect(&:email).select{|s| !s.blank?}.join(", ")
  @bsoldiers= (@user.battalion.soldiers).collect(&:email).select{|s| !s.blank?}.join(", ")
  @bsoldierspouse=((@user.battalion.soldiers)+(@user.battalion.primaries(:conditions => ["relationship = 'spouse'"]))).collect(&:email).select{|s| !s.blank?}.join(", ")
  @ballcontacts=((@user.battalion.soldiers)+(@user.battalion.primaries)+(@user.battalion.additionals)).collect(&:email).select{|s| !s.blank?}.join(", ")
elsif
  @position == ("Company Commander" or "First Sergeant" or "FRG Leader")
  @nok = (@user.company.primaries).collect(&:email).select{|s| !s.blank?}.join(", ")
  @spouses = (@user.company.primaries(:conditions => ["relationship = 'spouse'"])).collect(&:email).select{|s| !s.blank?}.join(", ")
  @soldiers= (@user.company.soldiers).collect(&:email).select{|s| !s.blank?}.join(", ")
  @soldierspouse=((@user.company.soldiers)+(@user.company.primaries(:conditions => ["relationship = 'spouse'"]))).collect(&:email).select{|s| !s.blank?}.join(", ")
  @allcontacts=((@user.company.soldiers)+(@user.company.primaries)+(@user.company.additionals)).collect(&:email).select{|s| !s.blank?}.join(", ")
end 

所以这不起作用,它既适用于一组位置,也适用于另一组,但不适用于两者。这与视图中的选择菜单相关,具体取决于您在某些人群中更改查询的位置。

所以在视图中我有这个:

<% if @position == "Battalion Commander" %>
<%= f.select(:bcc_email, [["Please Select", ""], ["Battalion NOK", @bnok], ["Battalion Spouses", @bspouses], ["Battalion Soldiers Only", @bsoldiers], ["Battalion Soldiers & Spouses", @bsoldierspouse], ["All Battalion Contacts", @ballcontacts]]) %></h1><br />

我还在学习rails并且我不确定案例陈述是否会更好但是我很困惑它在哪里以及该案例陈述如何适合视图。

任何指导都会很棒,我正试图消除这一点并弄清楚,但我真的很感激一些帮助。

3 个答案:

答案 0 :(得分:0)

首先,如果您可以更清楚地格式化它可能会有所帮助 - 对于我们和您自己,通常简单的格式化将有助于识别问题。

其次,你的目标是什么?我收集它是某种战争模拟器或什么?并且假设您在if语句中意识到只会执行其中一个:

if (xxx)
    aaaaaaaaaaaaaaaaaa
elseif (yyyy)
    bbbbbbbbbbbbbb
end

在xxx为真的情况下,aaaaaaaa将被执行,然后它将跳转到结束。 bbbbbbbbb部分不会被执行 - 即使是真的,因为第一个声明是。但是,如果xxx不为真,则会评估yyyy,如果为true,则会发生bbbbbbbbbbbbb。

我希望有所帮助吗?

答案 1 :(得分:0)

免责声明:我不知道红宝石。我被告知在某些方面它与python和LISP类似,所以这个答案就是这个假设。

我要做的是将这些条件变量保存在字典(或地图或哈希表中,无论您的语言是什么)。人的“等级”将是一个键,该值将对应于您要为该等级执行的功能。例如,

#the following example is python-esque. you'll have to port it to ruby.
def some_funct1(): #pass parameters if you need to. i don't, here.
    sql_stuff_here

def some_funct2():
    sql_stuff_here

map['important dude'] = some_funct1;
map['another important dude'] = some_funct1;
map['unimportant dude'] = some_funct2;
map['another_unimportant dude'] = some_funct2;

#after some time, you have a person whose rank is rank.

map[rank]() #this will execute the function

答案 2 :(得分:0)

你写了

if (... a big test ...)
  ..do some work..
elsif
  ..do something else..
end

但那是错的!您应该只写else而不是elsif,除非您需要检查另一个条件。

[我假设elsif后面没有任何东西= nil总是假的]