3

attr_accessibleRailsでの使用について質問があります。

一括割り当て保護をバイパスするためにに設定guard_protected_attributesしたい場合があります。false次の行が機能しない理由が不思議です (「キーを文字列化できません」というエラーが発生します)。

@user.attributes=({ :name => "James Bond", :admin => true }, false)

...しかし、これは:

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)

理由を知っている人はいますか?

4

4 に答える 4

6

Ruby パーサーは ' { :name => "James Bond", :admin => true}, false' を への単一の引数として解析するため#attributes=です。メソッド ' ' を呼び出すとfoo=、Ruby では引数が 1 つに制限されます。はそれsendを回避します。

実際に起こっていることは、Rails が のキーを文字列化しようとしているfalseということです。FalseClassHash

于 2009-06-04T17:04:34.460 に答える
1

それ以降のバージョンの ActiveRecord では、attributes= の 2 番目のパラメーターが削除されました。同じ効果で呼び出すことができます:

model.assign_attributes(attributes, :without_protection => true)
于 2012-05-03T16:47:31.467 に答える
1

皆さんがこれをフォローアップするかどうかを確認したいので、.send を使用するか、より良いアプローチがあるかどうかを確認します。

于 2009-08-31T08:12:05.540 に答える
1

私はヘルパーメソッドをいくつか定義して、一括代入の制限を少し簡単に回避できるようにしました。

module ActiveRecord
  class Base

    # Assigns attributes while ignoring mass assignment protection
    def force_feed(attributes)
      self.send(:attributes=, attributes, false)
      self
    end

  end
end
于 2011-01-07T18:36:25.467 に答える