Надлежащий поток для обработки неотображаемых полей базы данных в формах RoR? - PullRequest
1 голос
/ 25 декабря 2009

У меня есть следующая таблица базы данных:

account
-
id
first_name
last_name
email_address
password_md5_hash
last_logged_in
last_ip_address
date_time_created

Как видите, в учетной записи есть несколько полей со значениями, которые пользователь не будет вводить самостоятельно. Например, password_md5_hash будет хэшированным значением пароля, который они вводят, а date_time_created будет установлен на текущую дату / время при создании записи.

Итак, моя форма не обязательно будет содержать поля ввода для всех значений, или введенные значения будут обрабатываться перед записью в базу данных (то же самое было бы верно, если бы я хотел удалить HTML из текстового поля перед сохранением в базы данных).

Каков будет правильный процесс для 1) хеширования пароля, введенного в форму, и его сохранения, и 2) установки и сохранения значения поля date_time_created в базе данных при отправке формы? Эти вещи будут происходить в модели, нет? Может ли кто-нибудь предоставить пример кода или ссылку на тот, который объясняет это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 декабря 2009

При использовании attr_accessor я понимаю, что вы в основном создаете читателя и писателя, поэтому:

attr_accessor :password

равно

#Reader
def password
  @password
end

#Writer
def password=(pwd)
  write_attribute( :password, pwd )
end

В таких случаях, когда вам нужно изменить поле перед сохранением информации о модели в БД, вам просто нужно вручную создать модуль записи и изменить его так, как вы хотите ... так что в этом случае возьмите метод записи и используйте его создать соль и зашифровать ... что-то вроде:

def password=(pwd)
    @password = pwd
    return if pwd.blank?
    create_new_salt
    self.password_md5_hash = User.encrypted_password(self.password, self.salt)
end

Примеры методов, использованных выше:

def create_new_salt
    self.salt = "#{object_id}#{rand}"
end

def self.encrypted_password(password, salt)
    hashme = password + "morerandomtexthere" + salt
    Digest::SHA1.hexdigest(hashme)
end

Также, для date_time_created, просто используйте "t.timestamps" в вашей миграции, и если я не ошибаюсь, Rails будет обрабатывать их для вас.

1 голос
/ 25 декабря 2009

Лучшим способом, вероятно, будет использование ActiveRecord callback , здесь я буду использовать метод доступа, поэтому, когда вы создадите User.new (: password => "thing ") в вашем контроллере, это присваивается чему-то, что доступно, но не хранится в базе данных.

class User < ActiveRecord::Base

  attr_accessor :password

  before_save :hash_password

  ...

  private

  def hash_password
    attribute(:password_md5_hash => Digest::MD5.hexdigest(password))
  end
end

Я не думаю, что MD5 - это лучший способ хранить пароли (я думаю, что общепринятая практика - использовать хеш и соль, проверьте, как restful_authentication или authlogic делает это для лучших практик)

Для date_time_created, вы должны проверить поля «create_at» и «updated_at», которые уже предоставлены вам. Если вам нужен другой столбец, вы можете использовать тот же метод обратного вызова, если вам нужно манипулировать им перед сохранением в базе данных.

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