Rails - 如果不是数组rails

时间:2017-11-17 13:50:10

标签: ruby-on-rails arrays parameters

我收到一个参数,并希望它是这样的字符串:

"abc,efg"

或像这样的数组

["abc","efg"]

在第一种情况下,我想将其转换为数组,那会是什么好方法?

这就是我的想法

if params[:ids] && params[:ids].is_a? Array
     ids = params[:ids]
else if params[:ids]
    ids = params[:ids].split(",")

5 个答案:

答案 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, ',')