Ruby on rails Rails—方法如何在不调用db和不使用表单参数的情况下访问名称字段?

Ruby on rails Rails—方法如何在不调用db和不使用表单参数的情况下访问名称字段?,ruby-on-rails,Ruby On Rails,我是一个新手,正在观看Lynda.com关于rails 3的视频。教师创建了这样一个方法来查找用户 def name "#{first_name} #{last_name}" end 他说这将返回这个用户的名字和姓氏,但我不明白这个函数如何访问first_name last_name,因为没有对数据库的调用,也没有表单参数 我知道,如果不查看整个应用程序,您将不可能解释这一点,但您可以猜测此函数可能依赖于什么 这是整个AdminUser模型 require 'digest/sha1' c

我是一个新手,正在观看Lynda.com关于rails 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
需要“摘要/sha1”
类AdminUser:节\u编辑
属性访问器:密码
电子邮件地址{u REGEX=/^[A-Z0-9.{uz0%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}$/i
#标准验证方法
#验证是否存在:first\u name
#验证的长度为:first\u name,:max=>25
#验证是否存在:姓氏
#验证的长度为:last\u name,:max=>50
#验证是否存在:用户名
#验证:username,:within=>8..25的长度
#验证用户名的唯一性
#验证是否存在:电子邮件
#验证电子邮件的长度,最大值=>100
#验证:email、:with=>email\u REGEX的格式
#验证确认:电子邮件
#新的“性感”验证
验证:first_name,:presence=>true,:length=>{:max=>25}
验证:last_name,:presence=>true,:length=>{:max=>50}
验证:username,:length=>8..25},:university=>true
验证:email,:presence=>true,:length=>{:maximum=>100},
:format=>EMAIL\u REGEX,:confirmation=>true
#只有在创建时,才能更改此用户的其他属性
验证以下内容的长度:password,:within=>8..25,:on=>:create
保存前:创建散列密码
保存后:清除密码
作用域:named,lambda{| first,last |其中(:first_name=>first,:last_name=>last)}
范围:排序,顺序(“管理员用户。姓氏ASC,管理员用户。姓氏ASC”)
属性受保护:哈希密码:salt
定义名称
“#{姓}#{姓}”
结束
定义自我验证(用户名=”,密码=”)
user=AdminUser.find\u by\u用户名(username)
如果用户和用户密码匹配?(密码)
返回用户
其他的
返回错误
结束
结束
#具有相同哈希方法和salt的相同密码字符串
#应始终生成相同的哈希_密码。
def密码匹配?(密码=)
hashed_password==AdminUser.hash_with_salt(password,salt)
结束
def self.make_salt(用户名=”)
摘要:SHA1.hexdigest(“使用#{username}和#{Time.now}来制作盐”)
结束
定义self.hash_与_salt(密码=”,salt=”)
摘要:SHA1.hexdigest(“将{salt}放在{password}上”)
结束
私有的
def创建散列密码
#无论何时:密码有值,都需要哈希
除非密码为空?
#赋值时始终使用“self”
self.salt=AdminUser。如果salt.blank,是否生成_salt(用户名)?
self.hashed_password=AdminUser.hash_with_salt(密码,salt)
结束
结束
def清除密码
#为了安全起见,不需要b/c哈希
self.password=nil
结束
结束
方法“name”不是从数据库中查找用户,而是从相应的数据库表字段中读取其中的变量(first\u name和last\u name)。在本例中,假设遵循通常的rails约定,您将发现一个名为“AdminUsers”的数据库表,其中有一些字段,其中一个是first_name,另一个是second_name


这一切是如何工作的以及为什么会这样,可以在RubyonRails的文档中找到

,他说它将返回一个包含名字和姓氏的字符串,并不是说它将根据它们找到用户:),但他必须从某处获得它们。通常他使用一个函数,比如find_by_username etcCorrect。该函数将在手动或从DB设置first_name和last_name后使用。谢谢,但我感到困惑,因为有时他会使用函数,如按用户名查找等。是否有理由需要使用这样的函数?请查看ActiveRecord的链接文档。当教师使用方法名(如按用户名查找或按姓氏查找)时,这些名称会自动转换为在数据库中进行搜索。您不必编写诸如“Select*from AdminUsers,其中username='mjmitche”之类的SQL代码,而只需编写AdminUser.find_by_username('mjmitche')