Rails обновляет атрибут безопасности: используйте callback или attr_accessible? - PullRequest
0 голосов
/ 28 января 2010

У меня есть модель веб-сайта, которая требует от пользователя подтвердить право собственности на веб-сайт.

Благодаря переполнению стека я смог найти решение для проверки прав собственности здесь: Подтвердить право собственности на сайт в rails

После того, как модель прошла верификационный тест, для проверенного атрибута устанавливается значение true.

Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь хочет изменить атрибуты своего веб-сайта, он может легко изменить имя домена, в то время как проверенный атрибут остается истинным, что позволяет пользователю создавать объекты веб-сайта без подтверждения права собственности.

Я могу придумать два способа решения этой проблемы: 1. Сделайте обратный вызов, который изменит проверку на ложь, если доменное имя сайта будет изменено. 2. Разрешить attr_accessible для домена при создании нового объекта, но не при его обновлении.

Я поставлен в тупик относительно того, как реализовать любое из них на практике.

Ответы [ 3 ]

3 голосов
/ 28 января 2010

Обратные вызовы и Active Record. Грязные методы - определенно лучший способ для такого типа ситуаций.

before_update :set_domain_status

def set_domain_status
  self.verified = false if self.domain_changed?      
end

_changed? можно добавить к любому атрибуту, возвращая значение true, если значение изменилось по сравнению с значением, изначально загруженным из базы данных.

2 голосов
/ 28 января 2010

Я думаю, ваш вариант № 1 - лучший маршрут. В противном случае вы начнете пытаться согласовать действия по созданию и обновлению, что вам необходимо сделать для обработки варианта №2.

Вы можете переопределить установщик для имени домена и затем выполнить пользовательскую логику, например, так:

В вашей модели:

def domain=(the_domain)
 raise ValidOwnerRequired if verified? && domain != the_domain
 # if we got here then the this record is new and this is a creation attempt
 @require_domain_verification = true 
 # do other stuff here..
end

def require_domain_verification?
  @require_domain_verification == true
end

А затем найдите наблюдателя для этой модели:

def after_save(record)
  if record.require_domain_verification?
    SomeMailer.deliver_domain_verification(record)
  end
end

Нечто подобное ...

0 голосов
/ 28 января 2010

Коди, твой ответ сделал меня на правильном пути. Большое спасибо!

Вот что я сделал в моем случае:

  def domain=(the_domain)
     if domain != the_domain
     self[:domain] = the_domain
     self[:verified] = false
    end
  end

Работает просто отлично.

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