Ruby中的案例陈述[重复]

Posted

技术标签:

【中文标题】Ruby中的案例陈述[重复]【英文标题】:Case Statements In Ruby [duplicate] 【发布时间】:2014-02-26 14:18:53 【问题描述】:

我正在尝试创建一个 Case 语句来确定一个属性是否存在,如果存在则显示一个链接。

<% case %>
<% when @team_member.twitter? %>
  <%= link_to '', @team_member.twitter, target: '_blank', class: 'icon-twitter' %
<% when @team_member.facebook? %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% end %>

显然这不起作用,我想澄清的是

1) 在最初的案例之后我要声明什么,我见过的例子有&lt;% case a %&gt;&lt;% case object %&gt;,对吗? 2) 如何检查对象是否具有属性?

所以我在这里要做的就是说当:team_member 填充了它的 twitter 属性然后显示链接,对于 facebook 属性也是如此。

任何帮助表示赞赏

【问题讨论】:

&lt;% case %&gt;&lt;% case thingy %&gt; 应该可以工作。你只是不能混合它们。所以如果你有thingy,那么when 表达式必须代表thingy 的值。否则,没有thingy,它们是独立的表达式。第一个具有真值的将被执行,case 终止。为什么您认为您当前的 case 不起作用? ***.com/questions/9603321/… 不应该是if而不是case吗?案例语句用于基于属性的不同值的不同行为 - 但您希望基于两个不同属性的行为。如果团队成员同时拥有 twitter 和 facebook 帐户会怎样? 道歉,我认为很明显,当这两个属性都存在时,然后显示两个到 facebook 和 twitter 的链接 仅供参考,Ruby case 语句确实 not 需要目标表达式在案例的开头进行评估。例如,参见ruby.about.com/od/control/a/The-Case-Statement.htm。只要在整个case 语句中始终如一地使用它,它就可以在头部没有表达式的情况下工作,并且在when 子句中使用独立的可评估表达式。 【参考方案1】:
    没错,case 需要一个目标表达式来求值。 编辑:@mbratch 在 cmets 中指出 case 可以在没有目标表达式的情况下工作,正如 here 所述。这使得 caseif/else 构造一样工作。 如果您的对象是ActiveRecord 模型,您可以使用has_attribute?(attr_name)

在您的代码中,使用if 语句可能更容易,因为如果用户设置了这些属性,您可能希望同时显示 twitter 和 facebook 链接。

<% if @team_member.has_attribute?(:twitter) %>
  <%= link_to '', @team_member.twitter, target: '_blank', class: 'icon-twitter' %>
<% end %>
<% if @team_member.has_attribute?(:facebook) %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% end %>

【讨论】:

谢谢@zwippie,如果它们存在,我会尝试显示它们 另一个问题很抱歉,但似乎 has_attribute?当字段为空白(或我猜测为空)时不喜欢它,因为我有一个示例,其中 facebook 或 twitter 都没有填充到数据库中并且两个链接都显示 如果你只想在属性非空时显示链接,试试这个:unless @team_member.twitter.blank? 这还不是很干。我会把这个逻辑放在一个助手中(可能是一个参数化的) has_attribute? 询问该列是否存在于数据库中。如果您不确定该列是否存在(例如,如果@team_member 可以是不同类别的对象),并且您想测试它是否存在并且是否已设置,则执行if @team_member.has_attribute?(:twitter) &amp;&amp; !@team_member.twitter.blank?【参考方案2】:

大小写用于通过可能的匹配集来测试一个值:

<% case @team_member.whatever %>
<% when :facebook %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% when :twitter %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% end %>

您可能正在寻找的是if elsif 声明:

<% if @team_member.twitter? %>
  <%= link_to '', @team_member.twitter, target: '_blank', class: 'icon-twitter' %
<% elsif @team_member.facebook? %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% end %>

【讨论】:

【参考方案3】:

我认为普通的if 语句会更符合您的意图,因为每个分支都有不同的条件。 case 用于检查单个属性或变量的不同可能值,如下所示:

num_value = 5
case num_value
  when 0  # means: if num_value = 0
    doStuff()
  when 5  # means: if num_value = 5
    doOtherStuff() # this one is executed
end

它通常用于只输入可能的分支之一。但是,在您的示例中,如果用户同时设置了 twitter 和 facebook 链接,那么您应该使用单独的 if 语句:

<% if @team_member.twitter? %>
  <%= link_to '', @team_member.twitter, target: '_blank', class: 'icon-twitter' %
<% if @team_member.facebook? %>
  <%= link_to '', @team_member.facebook, target: '_blank', class: 'icon-facebook' %>
<% end %>

如果您只想要一个,请在第二次检查中使用elsif...

【讨论】:

以上是关于Ruby中的案例陈述[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MS Access Query 中的语法错误 [重复]

我可以在案例陈述中使用 .include?() 吗?红宝石

这个语法在ruby中是啥意思[重复]

Ruby on Rails Switch [重复]

从Ruby中的数组中删除重复元素

找出每个循环中的当前索引(Ruby)[重复]