24

オブジェクトをRedisキー/値ストアに保存するためにJSONでオブジェクトをエンコードするRails3アプリがあります。

オブジェクトを取得するとき、JSONをデコードして、次のようにデータからインスタンス化しようとしています。

def decode(json)
  self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end

問題は、これを行うには、attr_writer機能を付与していない属性に対して許可されていない大量の割り当てが含まれることです(正当な理由で言われています!)。

この操作のためだけにマスアサインメント保護をバイパスする方法はありますか?

4

3 に答える 3

86

assign_attributeswithout_protection: true邪魔にならないようです:

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }, :without_protection => true)
user.name       # => "Josh"
user.is_admin?  # => true

コメントで言及されている@tovodeverettは、newこのように1行で使用することもできます

user = User.new({ :name => 'Josh', :is_admin => true }, :without_protection => true)
于 2012-08-21T02:47:46.440 に答える
7

編集: kizzx2の答えははるかに優れた解決策です。

一種のハックですが...

self.new do |n|
  n.send "attributes=", JSON.decode( json )["#{self.name.downcase}"], false
end

これにより、attributes =が呼び出され、guard_protected_attributesパラメーターにfalseが渡され、一括割り当てチェックがスキップされます。

于 2011-04-14T07:22:09.707 に答える
4

この方法でも、一括割当を行わないユーザを登録することができます。

User.create do |user|
  user.name = "Josh"
end

これをメソッドに入れたいと思うかもしれません。

new_user(name)
  User.create do |user|
    user.name = name
  end
end
于 2012-11-08T20:28:28.383 に答える