2012-06-09 35 views
1

有人可以帮助我了解如何正确地写这个case语句,它不工作,作为一个小白,我不知道如何解决它:麻烦,这种情况下声明红宝石

def hide_link?(link, mailing) 
    case link 
    when 'edit' && ['sent', 'sending', 'archived'].include?(mailing.status) 
    return true 
    when 'send_schedule' && ['sent', 'sending', 'archived'].include?(mailing.status) 
    return true 
    when 'archive' && ['archived'].include?(mailing.status) 
    puts "I should be in here" 
    return true 
    else 'dashboard' && ['sending', 'draft'].include?(mailing.status) 
    return true 
    end 
end 

基本上我想返回true当链接符合某些标准时。

回答

3

我相信,如果链接不符合这些指标分析方法应返回false。因此:

def hide_link?(link, mailing) 
    case link 
    when 'edit' 
    ['sent', 'sending', 'archived'].include?(mailing.status) 
    when 'send_schedule' 
    ['sent', 'sending', 'archived'].include?(mailing.status) 
    when 'archive' 
    puts "I should be in here" 
    ['archived'].include?(mailing.status) 
    when 'dashboard' 
    ['sending', 'draft'].include?(mailing.status) 
    else 
    false 
    end 
end 

施工[...].include?(mailing.status)已导致truefalse这将返回为hide_link?方法的结果。

+0

谢谢megas完美的作品 – chell

1

删除return

link = "fred" 
case link 
    when "fred" 
    true 
    else 
    false 
end 

case将返回值本身,然后将其传递给该方法。

的MEGAS的版本重构:

def hide_link?(link, mailing) 
    statuses_to_hide = case link 
    when 'edit', 'send_schedule' 
     %w{sent sending archived} 
    when 'archive' 
     %w{archived} 
    when 'dashboard' 
     %w{sending draft} 
    else 
     [] 
    end 
    statuses_to_hide.include?(mailing.status) 
end 
1

案例陈述中的条件都遵循相同的形式,这表明有机会消除一些重复,并separate policy from implementation。该政策是一组的情况下,其链接应该被隐藏:

WHEN_TO_HIDE_LINK = [ 
    ['edit', %w(sent sending archived)], 
    ['send_schedule', %w(sent sending archived)], 
    ['archive', %w(archived)], 
    ['dashboard', %w(sending draft)], 
] 

实现是应用该策略的代码:折以下

def hide_link?(link, mailing) 
    WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses| 
    link_value == link && mailing_statuses.include?(mailing.status) 
    end 
end 

说明。


%(重量)

%w为指定字符串列表,而无需输入所有这些引号和逗号的方式。这:

%w(sent sending archived) 

是相同的:

['sent', 'sending', 'archived'] 

任何?

Enumerable#any?将数组的每个元素传递给块(位于doend之间的位)。如果该块曾经返回truthy,那么any?的结果为真;否则,any?的值为false。

阵列分解

你有没有注意到虽然WHEN_TO_HIDE_LINK每个元素是一个数组,传递给any?块不带阵列?你可能会认为你必须这样做:

WHEN_TO_HIDE_LINK.any? do |when_to_hide| 
    link_value = when_to_hide[0] 
    mailing_statuses = when_to_hide[1] 
    ... 

但是Ruby会将数组分解为多个部分。下面是做这件事:

WHEN_TO_HIDE_LINK.any? do |when_to_hide| 
    link_value, mailing_statuses = when_to_hide 
    ... 

当有在左边的=和逗号分隔变量右侧的数组,Ruby的数组分解为它的元素,并将它们分配到单独的变量。

但是Ruby可以让事情变得更简单:

WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses| 
    ... 

这等同于任何上述两个片段。