Rails - как метод получает доступ к полям имен без вызова БД и без параметров формы? - PullRequest
0 голосов
/ 24 сентября 2011

Я новичок, смотрю видео Lynda.com о рельсах 3. Учитель создает такой метод, чтобы найти пользователя

def name
   "#{first_name} #{last_name}"
end

Он говорит, что это вернет имя и фамилию для этогопользователь, но я не понимаю, как эта функция обращается к first_name last_name, поскольку нет вызова базы данных или параметров формы.

Я знаю, что без просмотра всего приложения вы не сможетеобъясните это, но вы можете догадаться, от чего может зависеть эта функция.

это вся модель AdminUser

require 'digest/sha1'
class AdminUser < ActiveRecord::Base

  # To configure a different table name
  # set_table_name("admin_users")

  has_and_belongs_to_many :pages
  has_many :section_edits
  has_many :sections, :through => :section_edits

  attr_accessor :password

  EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

  # standard validation methods
  # validates_presence_of :first_name
  # validates_length_of :first_name, :maximum => 25
  # validates_presence_of :last_name
  # validates_length_of :last_name, :maximum => 50
  # validates_presence_of :username
  # validates_length_of :username, :within => 8..25
  # validates_uniqueness_of :username
  # validates_presence_of :email
  # validates_length_of :email, :maximum => 100
  # validates_format_of :email, :with => EMAIL_REGEX
  # validates_confirmation_of :email

  # new "sexy" validations
  validates :first_name, :presence => true, :length => { :maximum => 25 }
  validates :last_name, :presence => true, :length => { :maximum => 50 }
  validates :username, :length => { :within => 8..25 }, :uniqueness => true
  validates :email, :presence => true, :length => { :maximum => 100 }, 
    :format => EMAIL_REGEX, :confirmation => true

  # only on create, so other attributes of this user can be changed
  validates_length_of :password, :within => 8..25, :on => :create

  before_save :create_hashed_password
  after_save :clear_password

  scope :named, lambda {|first,last| where(:first_name => first, :last_name => last)}
  scope :sorted, order("admin_users.last_name ASC, admin_users.first_name ASC")

  attr_protected :hashed_password, :salt

  def name
    "#{first_name} #{last_name}"
  end

  def self.authenticate(username="", password="")
    user = AdminUser.find_by_username(username)
    if user && user.password_match?(password)
      return user
    else
      return false
    end
  end

  # The same password string with the same hash method and salt
  # should always generate the same hashed_password.
  def password_match?(password="")
    hashed_password == AdminUser.hash_with_salt(password, salt)
  end

  def self.make_salt(username="")
    Digest::SHA1.hexdigest("Use #{username} with #{Time.now} to make salt")
  end

  def self.hash_with_salt(password="", salt="")
    Digest::SHA1.hexdigest("Put #{salt} on the #{password}")
  end

  private

  def create_hashed_password
    # Whenever :password has a value hashing is needed
    unless password.blank?
      # always use "self" when assigning values
      self.salt = AdminUser.make_salt(username) if salt.blank?
      self.hashed_password = AdminUser.hash_with_salt(password, salt)
    end
  end

  def clear_password
    # for security and b/c hashing is not needed
    self.password = nil
  end

end

1 Ответ

1 голос
/ 24 сентября 2011

Метод "name" не находит пользователя в базе данных, однако переменные внутри него (first_name и last_name) считываются из соответствующих полей таблицы базы данных.В этом случае, если следовать обычным соглашениям о рельсах, вы найдете таблицу базы данных с именем «AdminUsers» и внутри нее некоторые поля, одно из которых first_name, а другое second_name.

Как это все работает и почему это такможно найти в документации по Ruby on Rails для ActiveRecord

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