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)有结果truefalse将作为hide_link?方法的结果返回。

于 2012-06-09T11:00:17.583 回答
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
于 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']

任何?

可枚举#any? 将数组的每个元素传递给块(介于do和之间的位end)。如果块曾经返回truthy,那么结果any?为真;否则, 的值为any?假。

数组分解

你有没有注意到,虽然 的每个元素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|
  ...

这相当于前面两个片段中的任何一个。

于 2012-06-09T12:29:06.347 回答