2012-06-09 42 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| 
    ... 

這等同於任何上述兩個片段。