2

User モデルに次のコードがあります。

attr_protected :email

新しいユーザー オブジェクトを作成しようとしていますが、次のコードで一括割り当て保護エラーが発生します。

user = User.new(
    :first_name => signup.first_name,
    :last_name => signup.last_name,
    :email => signup.email,
    :birthday => signup.birthday,
    :encrypted_password => signup.encrypted_password,
    :salt => signup.salt
  )

attr_protected を回避してこのコードを機能させ、値を電子メールに割り当てる方法を知っている人はいますか?

ありがとうございました。

4

4 に答える 4

11
user = User.new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)
user.email = signup.email
于 2010-09-28T02:50:58.650 に答える
2

私は文字通り、この正確な問題に対処するために今夜宝石を書きました。今週中にプレゼンテーションを行った後、RubyGems.org に追加する予定です。それまでの間、コードをチェックアウトしてください。http://github.com/beerlington/sudo_attributes

gem を使用すると、コードは次のように変更されます。

user = User.sudo_new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :email => signup.email,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)

インスタンスを保存する場合にも使用できsudo_create()ます

于 2010-09-28T04:01:16.077 に答える
0

保護の核心は self.attributes= にあります。これは、self.send を使用すると、最後に Guard_protected_attributes と呼ばれる特別な隠しパラメーターを false としてトリガーできます。

例:

self.send(:attributes=, hash, false)

これにより、保護機能が完全にスキップされます。new では機能しませんが、最初にオブジェクトを作成してから、同じメソッドを呼び出して保存するだけで済みます。

于 2010-11-04T07:54:46.107 に答える