下面是一个用户注册表单,可以输入名、姓和密码。

数据库中也定义了这些字段:

create_table "users", :force => true do |t|    t.string   "first_name"    t.string   "last_name"    t.string   "password"
end

但是,如果我们想改变用户界面,在上面只显示全名full_name字段,而不是名first_name和姓last_name,怎么办呢?可以用虚拟属性来实现。首先,需要修改视图代码,把名和姓的字段进行合并。

<h1>Register</h1>
<% form_for @user do |form| %>
<ol class="formList">    <li>    <%= form.label :full_name, 'Full Name' %>    <%= form.text_field :full_name %>    </li>    <li>    <%= form.label :password, 'Password' %>    <%= form.password_field :password %>    </li>
</ol>
<% end %>

直接定义了full_name字段的new.html.erb.

现在,如果我们提交表单,就会查找User模型中现在并不存在的full_name字段。我们可以通过定义一个叫full_name的虚拟属性来创建这个字段。

class User < ActiveRecord::Base    # Getter    def full_name    [first_name, last_name].join(' ')    end    # Setter    def full_name=(name)    split = name.split(' ', 2)    self.first_name = split.first    self.last_name = split.last    end
end

User模型中定义的读取和赋值方法.

读方法读取first_namelast_name的值,用一个空格把他们组合起来,然后返回给用户。赋值方法则把传入的值在第一个空格处分割,把分割后的第一部分赋值给first_name,第二部分赋值给last_name

使用虚拟属性意味着用户界面上的字段不一定要对应到数据库表中的每一个字段。当用Rails适配到以前建立的数据库、并且不能修改表中的字段时,这将非常有用。

看看实际效果

让我们试试我们新的表单,看看是不是好用。我们输入全名“Jonh Smith”和密码“secret”。

Processing UsersController#create (for 127.0.0.1 at 2009-01-10 21:55:44) [POST]  Parameters: {"user"=>{"password"=>"secret", "full_name"=>" John Smith"}, "commit"=>"Add user", "authenticity_token"=>"6990f4ad21cb4f9c812a6f10ceef51faa4f46ce7"}  User Create (0.4ms)   INSERT INTO "users" ("first_name", "last_name", "password") VALUES('John', 'Smith', 'secret')

开发日志中显示新用户被写入到数据库中。

从上面的开发日志中我们看到,全名被传入create动作(然后被传入User模型),不过名和姓是被分隔后才被传入到INSERT语句中,然后写入了数据库。

虚拟属性提供了一个强大并且灵活的方法让你来定制你的用户界面。

作者授权:Your welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.

原文链接:http://railscasts.com/episodes/16-virtual-attributes

转载于:https://www.cnblogs.com/abbuggy/archive/2012/12/09/2809964.html

RailsCasts中文版,#16 Virtual Attributes 虚拟属性相关推荐

  1. Vue进阶之Virtual DOM(虚拟DOM) 实现原理

    Vue进阶之Virtual DOM(虚拟DOM) 实现原理 Virtual DOM(虚拟 DOM),是由普通的 JS 对象来描述 DOM 对象,因为不是真实的 DOM 对象,所以叫 Virtual D ...

  2. C#中对虚拟属性和抽象属性的重写,重写label实例

    从下面这个例子可以看出来区别public abstract class A{//抽象属性不能有实现代码public abstract string AbstractProperty { get; se ...

  3. Win10上安装Oracle VM Virtual Box虚拟软件

    现在即将要步入Oracle的学习中了,仅以此来记录我的学习过程,对自己一个交代. 我是以基于Oracle10G的这个版本(这是Oracle比较经典的一个版本)来学习的,这里我只介绍Oracle第一部分 ...

  4. Apache中Virtual Host虚拟主机配置及rewrite参数说明

    这篇文章主要介绍了Apache中Virtual Host虚拟主机配置及rewrite模块中的重要参数说明,是在同一个Apache服务器软件上部署多个站点的基础方法,需要的朋友可以参考下 Virtual ...

  5. 【Microsoft Azure 的1024种玩法】二十七. Azure Virtual Desktop虚拟桌面之快速创建配置(一)

    [简介] Azure 虚拟桌面是在云中运行的桌面和应用虚拟化服务,我们可以通过Azure 的虚拟桌面设置多会话 Windows 11 或 Windows 10操作系统的 部署,使整个 Windows ...

  6. 虚拟跑步刷步软件下载_dvdfab virtual drive win10版|dvdfab virtual drive(虚拟光驱) V1.5.1.1 官方版 下载_当下软件园...

    dvdfab virtual drive是一款较为实用的虚拟光驱软件.该软件可轻松生成和电脑上所安装的光驱功能一模一样的光盘镜像,让用户们可以轻松完成各种DVD的操作. [功能特色] [高速CD-RO ...

  7. Vue 源码学习—Virtual DOM(虚拟 DOM)

    Virtual DOM Virtual DOM是什么 真实DOM成员 引入原因 作用 Virtual DOM是什么 定义: 普通的js对象来描述DOM对象,不是真实的DOM,顾名思义,称为虚拟DOM ...

  8. 关于Microsoft Wi-Fi Direct Virtual Adapter虚拟网卡和安卓手机向Windows10笔记本投屏问题

    说明:本人小白,头一次发博客,针对小白用户,方便理解,可能有地方叙述的不准确或者不专业,请大佬们见谅!实验环境为华为荣耀9X(EMUI 9),联想Y7000(Windows10 1903) 突然发现手 ...

  9. k8s virtual cluster 虚拟集群多租户解决方案

    vcluster是一个开源的k8s多租户实现方式. 多租户本质上就是SAAS,关于k8s的多租户,如果要实现到阿里云.腾讯云的规模,需要为每一个租户创建一个单独的k8s集群,那么需要考虑的不仅仅是k8 ...

最新文章

  1. 容器的访问元素的成员函数(front,back,下标和at)返回的都是引用,如果顺序容器是const的对象,那么返回的是const的引用
  2. WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
  3. 7 种分布式全局 ID 生成策略,你更爱哪种?
  4. 圆括号匹配c语言代码,求救!!一道关于表达式圆括号匹配的经典题目
  5. 在Ubuntu 16.04 安装python3.6 环境并设置为默认
  6. 设计资源类网站|日常必逛设计导航
  7. python 把数据写到tet_Python随身听023基础知识到底哪里用逗号?
  8. C语言程序设计谭浩强(第四版)期末复习重点
  9. 天网防火网的安装与使用
  10. 代码急转弯——Tupper(塔珀自指公式)
  11. 博客显示ip签名图片html代码,如何制作显示IP的签名图片
  12. 127.0.0.1 zxt.php_shmilyzxt/
  13. python在医学中的应用_如何应用Python处理医学影像学中的DICOM信息
  14. JAVA计算机毕业设计租房管理系统Mybatis+系统+数据库+调试部署
  15. 逻辑卷管理员(Logical Volume Manager)介绍
  16. 新加坡金融科技节 | 蚂蚁金服CTO程立:面向全球开放,与合作伙伴共赢 1
  17. 【计算机网络综合实验】基于eNSP的计算机网络实验(完结篇)
  18. Latex学习笔记(六)——自定义Latex模板
  19. 光计算机的定义是什么意思,光计算机的意思_光计算机是什么意思_光计算机的近义词_反义词_读音-沪江在线词典...
  20. wordcloud绘制词云彩

热门文章

  1. Android疯狂ListView之旅 第一季 《侧滑删除条目》
  2. WM有约II(一):你在干嘛?
  3. Codeforces Round #470 Div. 1
  4. C语言学习之插入排序
  5. shell日志重定向到null
  6. SVN客户端与服务端安装详解
  7. 第二十三讲:访问者模式
  8. PyCharm注册码
  9. CALayers详解
  10. python基础语法快速浏览