代码之家  ›  专栏  ›  技术社区  ›  Brian

Ruby on Rails属性保护

  •  2
  • Brian  · 技术社区  · 14 年前

    我的用户模型中有以下代码:

    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
      )
    

    谢谢您。

    4 回复  |  直到 13 年前
        1
  •  11
  •   yfeldblum    14 年前
    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
    
        2
  •  2
  •   Peter Brown    14 年前

    我今晚真的写了一个宝石来处理这个问题。本周晚些时候,在我做了一个关于RubyGems.org的演示之后,我计划将它添加到RubyGems.org中。同时也可以自由地签出代码。 http://github.com/beerlington/sudo_attributes

    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() 如果要保存实例

        3
  •  1
  •   Steven Soroka    11 年前

    如果您知道散列是安全的,那么update_属性现在允许您重写保护,例如用于您正在设置的字段不是来自用户可控制散列的内部使用。

    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
    }, {without_protection: true})
    

    你也可以考虑一下 roles :

    User.new(params, as: :admin)
    
        4
  •  0
  •   William Yeung    14 年前

    例子:

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

    这将完全跳过保护功能。它在new上不起作用,但是您可以先创建对象,然后调用相同的方法并保存,我想不会太痛苦。

    推荐文章