Ruby中的案例陈述

时间:2014-02-26 14:18:53

标签: ruby-on-rails ruby case

我试图创建一个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属性也是如此。

任何帮助表示赞赏

3 个答案:

答案 0 :(得分:5)

  1. 这是正确的,case需要一个目标表达式来评估。编辑:@mbratch在评论中指出case可以在没有目标表达式的情况下工作,如上所述{ {3}}。这使caseif/else构造一样工作。
  2. 如果您的对象是ActiveRecord模型,则可以使用has_attribute?(attr_name)
  3. 在您的代码中,使用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 %>
    

答案 1 :(得分:1)

Case用于通过可能的匹配集测试值:

<% 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 %>

答案 2 :(得分:0)

我认为正常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 ...