0

我有一个带有 5 个布尔字段的设置表。我希望能够通过 JSON 创建和更新这些字段。据我了解,Rails 将所有参数转换为字符串,因此布尔值始终返回 true。如果我发送:

{ "settings": { "setting1":true, "setting2":false } }

然后尝试做: Setting.new(params[:settings]),这两个设置在数据库中都将为真,因为第二个设置的值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 中看起来很标准,似乎会以更优雅的方式处理?

4

2 回答 2

1

您可以通过“0”而不是 false 将字段的值设置为 false。

于 2012-11-13T20:03:27.900 回答
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

将更改的参数分配给新的 Hash 对象并将其传递给模型可能更符合 Rails。

于 2012-11-13T19:56:31.777 回答