Как Rails портит столбцы активных записей по умолчанию? - PullRequest
4 голосов
/ 16 марта 2012

Вопрос о магии Rails:

Я играл с IRB и испорчен?метод, то я просто сделал следующее:

>> User.first.attributes.collect { |column, value| [column, value.tainted?] }
=> [["phone", true], ["state", false], ["persistence_token", true], ["last_login_ip", true], ["country", true], ["login_count", false], ["last_request_at", false], ["id", false], ["forname", true], ["current_login_at", false], ["name", true]]

Кто-нибудь знает, почему некоторые параметры испорчены, а некоторые нет?И если есть способ выбрать, какой столбец следует испортить?

РЕДАКТИРОВАТЬ :

Спасибо за ответы.

@ sgtFloyd: Я простопытался вручную обновить страну.и вот что происходит:

>> u = User.first
>> u.country = "USA"
=> "USA"
>> u.country.tainted?
=> false
>> u.save
=> true
>> u.country.tainted?
=> false
>> u.reload
>> u.country.tainted?
=> true
>> u.country.class
=> String # it's also string in the database

EDIT 2 :

Я удалил все внутри модели User, и некоторые столбцы String не выглядят испорченными, в то время как некоторые делают...

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

AFAIK, Rails не использует taint, он отслеживает изменения и условия html_safe, но я не видел упоминаний о taint.Документы ruby ​​для taint говорят, что они должны быть испорчены, если исходят из внешних источников, я думаю, это как-то связано с используемыми библиотеками sql.Но не видя саму эту библиотеку, я не могу догадаться, почему некоторые испорчены, а некоторые нет.

Запуск этого кода в моих проектах приводит ко всем ложным.Скорее всего, это зависит от того, какую версию ruby ​​/ rails и т. Д. Вы используете, и, поскольку она не определена rails, вероятно, неуместно зависеть от нее.

2 голосов
/ 16 марта 2012

С Программирование Ruby

Любой объект Ruby, полученный из какого-либо внешнего источника (например, чтение строки из файла или переменной среды) автоматически помечены как испорченные. Если ваша программа использует испорченный объект для получить новый объект, то этот новый объект также будет испорчен ...

Из вашего примера столбцы, такие как last_login_at, password_salt и created_at создаются и обрабатываются исключительно внутри, без использования какого-либо пользовательского ввода. phone, email, country и т. Д. Получены из пользовательского ввода, поэтому они по сути ненадежны.

2 голосов
/ 16 марта 2012

taint и tainted? являются методами класса объектов Ruby.Если вы ищете, какие объекты были изменены в вашем Rails-приложении, возможно, вы искали Изменено?

@customer.email = 'new@email.com'
do_something if @customer.email_changed? 
...