查看英文原版
下面是一个用户注册表单,可以输入名、姓和密码。
数据库中也定义了这些字段:
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_name和last_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语句中,然后写入了数据库。
虚拟属性提供了一个强大并且灵活的方法让你来定制你的用户界面。
- 大小: 43.9 KB
分享到:
相关推荐
- 版权声明指出所有文档和软件都包含Imperas公司软件有限公司的属性信息,且必须遵守提供的许可协议。 - 说明了任何复制、传输、翻译或任何形式的使用都需要Imperas公司的书面许可。 - 提到技术数据受美国出口管制...
当进程需要访问虚拟地址时,内核会通过页表进行翻译,找到对应的物理地址,如果物理内存不足,还会涉及到交换机制,将不常使用的页面写入磁盘,从而实现内存的动态扩展。 总的来说,Linux的内存管理机制是复杂而...
【标题】:“基于面向对象的粒子系统”是一个重要的计算机图形学概念,特别是在游戏开发和虚拟现实应用中。面向对象编程(Object-Oriented Programming, OOP)是软件开发中的核心编程范式,它通过将数据和操作数据的...
虚拟地址空间是操作系统中进程内存管理的核心概念,它允许每个进程拥有独立的、不重叠的内存视图,即使这些进程...同时,通过页表和地址翻译机制,操作系统可以实现内存保护,防止一个进程错误地访问其他进程的内存。
Vue2.0是一款非常流行的前端JavaScript框架,由尤雨溪开发,它以其简洁的API、高效的虚拟DOM和组件化的设计而受到广大开发者喜爱。在这个"vue2.0 实现翻译的小案例"中,我们将深入探讨如何在Vue2.0项目中实现翻译...
- **翻译和设置页表项(Translating and Setting Page Table Entries)**:在进程上下文切换时,内核会更新这些页表项,以确保进程只能访问自己的虚拟内存。 - **分配和释放页表(Allocating and Freeing Page ...
1. "使用说明.txt":这是软件的使用指南,详细解释了如何操作和配置虚拟光驱,包括如何加载和卸载映像文件,设置虚拟光驱的属性等。 2. "低调的异次元.url":这可能是一个链接,指向一个名为"低调的异次元"的网站,...
1. **虚拟DOM(Virtual DOM)**:React通过虚拟DOM实现高效的UI更新。当组件状态改变时,React会计算出最小化的DOM操作,以更新实际的DOM,这一过程称为"reconciliation"。 2. **组件(Components)**:React应用由...
Unity是一款广泛应用于游戏开发、虚拟现实和增强现实等领域的实时渲染引擎,其内置Shader是实现各种视觉效果的基础。这份翻译版文档包括了多个章节,覆盖了Unity Shader的各个方面,对于初学者和有经验的开发者来说...
该研究工作属于虚拟现实应用领域,构建的系统包含了ACIS的API层,用于获取和翻译STEP中性文件,对实体进行细化和面片处理。Open Inventor的交互层提供了Scene Graph库,定义了Inventor作为VRML的基础文件格式,最后...
课程采用的教材是《计算机图形学(第三版)》,由Donald Hearn等人撰写,蔡士杰等翻译,以及多本相关领域的经典著作作为参考,如孙家广的《计算机图形学》和胡小强的《虚拟现实技术》等。此外,课程还推荐了多个国际...
企业内部的“行政”属性逐渐弱化,转而倾向于自组织和柔性化协作。这种模式不仅存在于大公司,也适用于中小型公司,甚至个体译员,形成了大规模、社会化的协作网络。 随着社会分工的深化,泛“工作社交”平台的出现...
- Name:在VuGen(Virtual User Generator,虚拟用户生成器)的树形视图中显示的名称,也可作为事务名称。 - url:要加载的网页URL。 - List of Attributes:包括额外的属性,如HTTP头等。 - EXTRARES:标记资源...
Kotlin是一种运行在Java虚拟机上的静态类型编程语言,它最初由JetBrains公司设计,并于2011年首次发布,2016年被Google宣布为Android官方支持的开发语言。Kotlin的设计目标是能够与Java代码完全互操作、提供更简洁的...
- **TLB属性:** 用于描述翻译后备缓冲区(TLB)的特性。 - **内部(L1)缓存属性:** 描述L1缓存的特性。 - **多级和共享缓存节点 (/cpus/cpu\*/l?-cache):** 描述多级缓存和共享缓存的配置。 #### 四、设备绑定 ...
开发者可以创建自定义组件,如分词输入框、翻译展示区、操作按钮等,通过Vue的生命周期钩子函数和计算属性来处理用户输入和更新视图。 Django Restful Framework(DRF)是基于Python的Django Web框架的一个扩展,...
5. **修改元件属性**:双击元件进行属性设置,如改变电压值或引脚编号。 6. **连接电路**:使用导线连接元件,注意公共地线的使用,删除或移动导线。 7. **仿真电路**:完成电路连接后,启动仿真,使用虚拟仪表测量...