2013-07-29 2 views
-1

Я работаю над приложением Rails 4, которое создает ключ, хэширует его на before_create и сохраняет его в модели. Если я хочу сбросить этот ключ, я могу вызвать current_user.touch и будет вызываться before_update, а before_update будет иметь те же методы, что и before_create, поэтому старый ключ будет обновлен новым. Я хочу получить этот простой текстовый ключ для создания, поэтому я использую attr_accessor и заполняю переменную простым текстом при создании, и я возвращаю ключ, который в порядке. Проблема в том, что если я назову touch, обновите! Я верю true или false вместо записи, поэтому я не могу получить доступ к переменной attr_accessor, и если я попытаюсь перезагрузить ее, тогда ключ исчезнет, ​​потому что он доступен только в экземпляре. Кто-нибудь знает способ принудительного и обновления и возврата самой записи в этом экземпляре вместо истинного или ложного?Rails Touch and Return attr_accessor

class Key < ActiveRecord::Base 
    include BCrypt 

    attr_accessor :access_key_hex 
    before_update :set_access_key 
    before_create :set_access_key 

    def access_key 
    @access_key ||= Password.new(access_key_hash) 
    end 

    belongs_to :user 

    protected 

    def set_access_key 
    self.access_key_hex = SecureRandom.hex(50) 
    @access_key = Password.create(access_key_hex) 
    self.access_key_hash = @access_key 
    end 
end 

В моем контроллере я использую @key = active_user.key.update!(nil), который прекрасно работает, и он автоматически обновляет ключ, проблема извлечения ключа на обновление, на создание его штраф.

+0

Можете ли вы опубликовать свой код модели? – zeantsoi

+0

@zeantsoi сделано. – ny95

+0

Как FYI, вы, возможно, можете СУБДИТЬ свой код, используя обратный вызов 'after_save', который включает как' before_create', так и 'before_update'. – zeantsoi

ответ

0

Вместо запуска set_access_key в качестве обратного вызова ActiveRecord на touch, рассмотреть вопрос об объявлении о set_access_key как общедоступный метод и вызова метода на вашем экземпляре модели непосредственно:

# app/models/key.rb 
class Key < ActiveRecord::Base 
    include BCrypt 

    attr_accessor :access_key_hex 
    # before_update :set_access_key # REMOVE CALLBACK 
    # before_create :set_access_key # REMOVE CALLBACK 

    def access_key 
     @access_key ||= Password.new(access_key_hash) 
    end 

    belongs_to :user 

    def set_access_key 
     self.access_key_hex = SecureRandom.hex(50) 
     @access_key = Password.create(access_key_hex) 
     self.access_key_hash = @access_key 
     @access_key # returns access key from the method 
    end 
end 

Затем в контроллере, все, что вам нужно сделать это вызвать set_access_keyнепосредственно на экземпляр объекта и значение ключа будет назначен @key:

@key = active_user.key.set_access_key 
print @key #=> value of the access_key_hex 
+0

Прошу прощения, я не упоминал об этом раньше, но вместо этого есть два ключа. Я просто взял другого, чтобы легче объяснить эту проблему. – ny95

+0

Какой вопрос задать вопрос, если вы не представите детали? Никому не легче отвечать, только чтобы быть информированным о том, что критическая часть информации была удержана. Уточните свой вопрос? – zeantsoi

+0

Итак, у вас есть два ключа вместо одного. Изменится ли это решение? – zeantsoi