以下代码我尝试通过api将电子邮件别名分配给我们的售票系统。
@email.cc_list = case @site_id
when /site1/ || /site2/; "smail-alias-1"
when /site3/ || /site4/ || /site5/ || /site6/; "email-alias-2"
when /site7/ || /site8/; "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
问题是实际上只有正确分配了站点1,3,7,9和10。在||之后的任何事情没有工作。
我宁愿避免使用10个别名的10个语句。有没有一种方法可以使这个case语句使用哈希,以便让系统确定它何时匹配指定的site_id?或其他方式使这些或功能发挥作用?
答案 0 :(得分:2)
你可以写:
@email.cc_list = case @site_id
when /site(1|2)/ then "smail-alias-1"
when /site(3|4|5|6)/ then "email-alias-2"
when /site(7|8)/ then "email-alias-3"
when /site9/ then "email-alias-4"
when /site10/ then "email-alias-5"
end
答案 1 :(得分:2)
不要给你正确的方法,因为其他人已经这样做了,但是你知道原始代码失败的原因会很好。
case @site_id
when /site1/ || /site2/ ...
不会转化为:
if @site_id =~ /site1/ || @site_id =~ /site2/ ...
但是:
if @site_id =~ /site1/ || /site2/ ...
解析为:
if ((@site_id =~ /site1/) || /site2/) ...
所以,当第一场比赛失败时,它会返回nil
。 nil
|| -ed与正则表达式对象具有正则表达式对象本身的值。条件中的正则表达式对象的布尔值为......您猜测:false
警告:条件中的正则表达式文字
如果你直接在if语句中这样做。
答案 2 :(得分:1)
您可能更愿意写:
@email.cc_list = case @site_id[/\d+/].to_i
when 1,2 then "smail-alias-1"
when 3..6 then "email-alias-2"
when 7,8 then "email-alias-3"
when 9 then "email-alias-4"
when 10 then "email-alias-5"
end
答案 3 :(得分:0)
你可以加入你的正则表达式Regexp.union:
@email.cc_list = case @site_id
when Regexp.union(/site1/, /site2/); "smail-alias-1"
when Regexp.union(/site3/, /site4/, /site5/, /site6/); "email-alias-2"
when Regexp.union(/site7/, /site8/); "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
或者像/site1|site2/
那样使用正则表达式,这就是联盟在这里基本上会为你做的。