有人可以帮助我理解如何正确地写这个案例陈述它不起作用而作为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。
答案 0 :(得分: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?
方法返回。
答案 1 :(得分: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
答案 2 :(得分: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?将数组的每个元素传递给块(do
和end
之间的位)。如果块永远返回 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|
...
这相当于前两个片段中的任何一个。