我收到一个参数,并希望它是这样的字符串:
"abc,efg"
或像这样的数组
["abc","efg"]
在第一种情况下,我想将其转换为数组,那会是什么好方法?
这就是我的想法
if params[:ids] && params[:ids].is_a? Array
ids = params[:ids]
else if params[:ids]
ids = params[:ids].split(",")
答案 0 :(得分:3)
我会使用三元组来保持简单并且在一条线上:
ids = params[:ids].is_a?(String) ? params[:ids].split(',') : params[:ids]
如果您尝试在split
上调用nil
params[:ids]
,则我已撤消订单,因此您不会收到未定义的方法错误。
答案 1 :(得分:1)
Array.wrap(params[:ids]).map{|x| x.split(',')}.flatten
答案 2 :(得分:1)
道歉打桩。但我想我会对SickLickWill提出的答案稍作调整(它没有正确处理Array
案例):
ids = params[:id].split(',').flatten
这将很好地处理String
案例:
:001 > params = {id: "abc,efg"}
:002 > ids = params[:id].split(',').flatten
=> ["abc", "efg"]
以及Array
案例:
:003 > params = {id: ["abc","efg"]}
:004 > ids = params[:id].split(',').flatten
=> ["abc", "efg"]
如果id
param有机会为零,那么这个barfs:
:005 > params = {}
=> {}
:006 > ids = params[:id].split(',').flatten
NoMethodError: undefined method `split' for nil:NilClass
所以,你可以进行条件测试:
:007 > ids = params[:id].split(',').flatten if params[:id]
=> nil
或者,使用try
:
:008 > ids = params[:id].try(:split, ',').try(:flatten)
=> nil
答案 3 :(得分:0)
您错过了end
代码并且您错误else if
并且您可以删除对params[:ids]
的检查,因为如果:ids
密钥不存在is_a?
则返回{ {1}}
我认为你可以做到这一点
NilClass
答案 4 :(得分:0)
我认为最短的方法是使用.try
。它可以避免你写出if-then-else。
params_id = params[:id].try(:split, ',')