我一直在寻找这个地方,我想知道我是否做错了什么。只是为了仔细检查,我会问你们!
所以我在Rails控制器中接收params
。一个key, value
对是:status => true/false
。但是,我发现当我尝试将status
发布为像
:status => "THIS IS NOT A BOOLEAN"
并在我的控制器中创建我的对象,我的对象的:status
属性变为false
。
因此,在rails中是否有任何干净的方法来验证我的:status
是否对应于布尔值?
谢谢!
答案 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 强>
原因有两个:
- 的 DRY 强>
- 的 MVC 强>
醇>
如果您想保持应用程序干燥,则需要确保始终只有一个验证参考。被称为"Single Source Of Truth",这意味着如果您尝试使用其他控制器/方法填充模型,您仍然会调用相同的验证
其次,您需要考虑MVC (Model-View-Controller) pattern。 MVC是Rails的核心方面,意味着你必须使用你的控制器来整理数据 - pull&amp; amp;编译模型中的数据。对于验证也是如此 - 始终确保您使用数据(模型中的IE)进行验证