我有一个包含5个布尔字段的设置表。我希望能够通过JSON创建和更新这些字段。据我所知,Rails将所有参数转换为字符串,因此布尔值总是返回true。如果我发送:
{ "settings": { "setting1":true, "setting2":false } }
然后尝试执行:Setting.new(params[:settings])
,这两个设置在数据库中都为true,因为false
的第二个设置的值已转换为"false"
,因此实际上评估为true
。实际上我甚至不能这样做,因为我得到了:
NoMethodError (undefined method `stringify_keys' for #<String:0x000000213dcbd0>)
就在那条线上。来自互联网的一些建议说,将参数与"true"
进行比较,然后存储。这是一个巨大的痛苦,因为那时我无法利用群众分配。我不想这样做:
@setting = Setting.new
@setting.setting1 = (params[:settings][:setting1].eql? "true")
...
对于所有5个字段,特别是因为我必须为创建,更新甚至从其他控制器执行此操作(某些控制器接受JSON以创建设置对象及其自己的属性)。
还有更好的方法吗? JSON API似乎与Rails非常标准,似乎会以更优雅的方式处理它?</ p>
答案 0 :(得分:1)
您可以传递“0”而不是false来将字段的值设置为false。
答案 1 :(得分:0)
如何制作转换器类并将其粘贴在之前的过滤器中?
class ApplicationController < ActionController::Base
before_filter BooleanFilter
end
class BooleanFilter
def self.filter(controller)
# change all relevant string params to booleans, raise an exception if something other than "true" or "false" is detected
# eg. params[:setting][:setting1] = ( params[:setting][:setting1] == "true" ? true : false )
end
end
可能与Rails更一致的是将更改的参数分配给新的Hash对象并将其传递给模型。