RoR: attr_encrypted назначение не пишется? - PullRequest
2 голосов
/ 22 марта 2011

Я использую attr_encrypted (v 1.2.0) в RoR 3.0.5 для шифрования учетных данных, которые я не хочу отображать в виде простого текста в моей БД. Когда я обновляю зашифрованное поле, кажется, что оно не сохраняется в БД.

Моя модель по существу:

class Service << ActiveRecord::Base
    attr_encrypted :credentials_aux, :key => KEY, :attribute => 'encrypted_credentials', :encode => true, :marshal => true

  def credentials
    credentials_aux
  end

  def credentials=(c)
    h = {}.update(c)  # coerce HashWithIndifferentAccess to a vanilla hash
    credentials_aux = h
  end

  ...
end

(Обратите внимание, что метод 'credentials =' существует просто для того, чтобы сгенерировать Rails-сгенерированный HashWithIndifferentAccess в ванильный хеш. Он также дает мне место для вставки отладочной распечатки для проверки моих данных.)

Но когда я пытаюсь обновить учетные данные через консоль, это не займет:

>> s = Service.find(19)
=> #<Service id: 19, encrypted_credentials: "10VfHU7IkdrFb4Q6Hj18YtY81rbRp3sIuoVUl8CHNj88cq1XFo2...",>
>> s.credentials
=> {"user_id"=>"fred.flintstone", "password"=>"supersecret"}
>> s.credentials = {"user_id" => "barney.rubble", "password" => "notsosecret"}
=> {"user_id" => "barney.rubble", "password" => "notsosecret"}
>> s.credentials
=> {"user_id"=>"fred.flintstone", "password"=>"supersecret"}

Почему s.credentials не обновился до нового значения?

1 Ответ

3 голосов
/ 22 марта 2011

Я полагаю, что вы просто устанавливаете локальную переменную с именем "credentials_aux" в своем методе "credentials =", попробуйте явно использовать "self"

def credentials=(c)
  h = {}.update(c)  # coerce HashWithIndifferentAccess to a vanilla hash
  self.credentials_aux = h
end

Я на самом деле поддерживаю этот проект, поэтому, если вышеприведенное исправление не сработает, я открою для этого новый тикет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...