0

5 つのブール値フィールドを持つ設定テーブルがあります。これらのフィールドを JSON 経由で作成および更新できるようにしたいと考えています。私が理解していることから、Rails はすべてのパラメーターを文字列に変換するため、ブール値は常に true を返します。私が送信した場合:

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

そして、やってみてください: 、2 番目の設定の値が に変換され、実際には に評価されるため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 ではかなり標準的なように見えますが、これはよりエレガントな方法で処理されるように見えますか?

4

2 に答える 2

1

falseの代わりに「0」を渡して、フィールドの値を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

変更されたパラメーターを新しいハッシュオブジェクトに割り当て、それをモデルに渡す方が、おそらくRailsとの整合性が高くなります。

于 2012-11-13T19:56:31.777 に答える