验证Rails中的参数类型

时间:2014-08-02 22:55:28

标签: ruby-on-rails ruby-on-rails-4 params

我一直在寻找这个地方,我想知道我是否做错了什么。只是为了仔细检查,我会问你们!

所以我在Rails控制器中接收params。一个key, value对是:status => true/false。但是,我发现当我尝试将status发布为像

这样的字符串时

:status => "THIS IS NOT A BOOLEAN"

并在我的控制器中创建我的对象,我的对象的:status属性变为false

因此,在rails中是否有任何干净的方法来验证我的:status是否对应于布尔值?

谢谢!

3 个答案:

答案 0 :(得分:3)

这个非常奇怪的方法将成功

def is_boolean?(item)
  !!item == item
end

params[:status] = 'some string'
is_boolean?(params[:status])
# => false

params[:status] = true
is_boolean?(params[:status])
# => true

稍微更直观的版本

def is_boolean?(item)
  item == false || item == true
end

答案 1 :(得分:1)

The above @Iceman solution is good如果你只是在一次这样做,但你继续在其他地方做/重复它我建议你创建to_bool方法。即

class String
   def to_bool
    return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
    return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i)
    raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
   end
end

并将此方法放在初始化程序或库中。而且,你可以简单地做到这一点

 Mymodel.new(status: params[:status].to_s.to_bool)

我们正在执行to_s只是因为要将nil转换为''status密钥不在params中。

答案 2 :(得分:1)

<强>验证

执行此操作的Rails way是在模型(from the docs)中验证:

#app/models/model.rb
Class Model < ActiveRecord::Base
   validates :status, inclusion: { in: [true, false] }, message: "True / False Required!"
end

-

<强> MVC

原因有两个:

  
      
  1. DRY
  2.   
  3. MVC
  4.   

如果您想保持应用程序干燥,则需要确保始终只有一个验证参考。被称为"Single Source Of Truth",这意味着如果您尝试使用其他控制器/方法填充模型,您仍然会调用相同的验证

其次,您需要考虑MVC (Model-View-Controller) pattern。 MVC是Rails的核心方面,意味着你必须使用你的控制器来整理数据 - pull&amp; amp;编译模型中的数据。对于验证也是如此 - 始终确保您使用数据(模型中的IE)进行验证