1

誰かがこのケースステートメントを正しく書く方法を理解するのを手伝ってくれますか? NOOBとして、私はそれを修正する方法がわかりません:

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 を返したいと考えています。

4

3 に答える 3

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)には結果が含まれているtrueか、メソッドfalseの結果として返されます。hide_link?

于 2012-06-09T11:00:17.583 に答える
1

を削除しreturnます。

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

case値自体を返し、それがメソッドに渡されます。

メガバージョンのリファクタリング:

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
于 2012-06-09T10:52:31.350 に答える
1

ケース ステートメントの条件はすべて同じ形式に従います。これは、一部の繰り返しを排除し、ポリシーを実装から分離する機会があることを示唆しています。ポリシーは、リンクを非表示にする一連の条件です。

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 は、引用符やカンマをすべて入力せずに文字列のリストを指定する方法です。これ:

%w(sent sending archived)

これと同等です:

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

どれか?

Enumerable#any? 配列の各要素をブロック (doとの間のビットend) に渡します。ブロックがtrueyを返す場合、 の結果any?は true です。それ以外の場合、値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 は配列をパーツに分解してくれます。これを行う1つの方法は次のとおりです。

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

これは、前の 2 つのフラグメントのいずれかと同等です。

于 2012-06-09T12:29:06.347 に答える