新手问题 判断 params ['foo'] 存在,是数组,并且包含某个值的快捷方式?

perrywky · 2013年07月24日 · 最后由 Ddl1st 回复于 2013年07月26日 · 5600 次阅读

为了避免报错,我会在 action 里做如下检查

if ( params['foo'].nil? && params['foo'].kind_of?(Array) && params['foo'].include?('bar') )

有没有更加便捷点的写法?

nil 判断可以去掉,因为 nil 必然不是 Array

if params['foo'].to_a.try(:include?, 'bar') 不知道这样能不能完成你的校验...

3 楼 已删除

#3 楼 @luikore

"foobar".include?("bar")

干脆包一下好了,不至于那么丑

foo = Array(params['foo'])
foo.include?('bar')

params[:foo].try(:include?, 'bar') #=> return true or nil

if 'bar'.in?(params[:foo]) ... end rescue nil

6 楼,用你的方式 不太对,报错 如下

NoMethodError: undefined method `try' for nil:NilClass
    from (irb):3
    from /home/andy/.rvm/rubies/ruby-1.9.3-p448/bin/irb:13:in `<main>'

个人感觉 #5 楼 的方式 更好些。

#8 楼 @meeasyhappy

try方法是在 rails 里定义的。。。在 rails console 里试试?

#8 楼 @meeasyhappy 因为 try 是 Rails 提供的方法,并不是 ruby 就有的了 @zfben

@mouse_lin and @loveky ,刚才试一下,确实可以。非常感谢提醒!!

#11 楼 @meeasyhappy 6 楼的判断会有漏洞 不只 Array 有 include?方法 字符串也有 所以必然先要 to_a 一下~

@zj0713001 Array(a) 和 a.to_a 没有区别呀

#10 楼 @mouse_lin 楼主在 action 里判断 params,明显是 rails。 @zj0713001 我猜测楼主的应用场景是判断某个 checkbox 是否选中,所以实际场景如果不是数组或者 nil 就是被黑了。加上 to_a 的确更保险。

#4 楼 @doitian 是的.. 而且 Hash 也有 include?, deleted

#15 楼 @zfben 估计就是酱紫批量处理的场景 不过大家聊的很 high 楼主一直没粗线...

#15 楼 @zfben #17 楼 @zj0713001 #13 楼 @meeasyhappy

谢谢你们的回复,我的确就是在 rails 里使用,既然 nil 可以直接转化成数组,也就没有必要 try 了吧 :)

params[:foo].to_a.include? 'bar'

[*params[:foo]].include?('bar')

Array.wrap(params['foo']).include?('bar')
需要 登录 后方可回复, 如果你还没有账号请 注册新账号