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) 在最初的案例之后我要声明什么,我见过的例子有<% case a %>
或<% case object %>
,对吗?
2) 如何检查对象是否具有属性?
所以我在这里要做的就是说当:team_member
填充了它的 twitter 属性然后显示链接,对于 facebook 属性也是如此。
任何帮助表示赞赏
【问题讨论】:
<% case %>
或 <% case thingy %>
应该可以工作。你只是不能混合它们。所以如果你有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
需要一个目标表达式来求值。case
可以在没有目标表达式的情况下工作,正如 here 所述。这使得 case
像 if/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) && !@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中的案例陈述[重复]的主要内容,如果未能解决你的问题,请参考以下文章