编写嵌套表单
2016-07-28 13:45
489 查看
很多程序已经复杂到在一个表单中编辑一个对象已经无法满足需求了。例如,创建
Active Record 为此种需求在模型中提供了支持,通过
这段代码会在
使用下面的表单可以创建
如果关联支持嵌套属性,
的键是什么不重要,但至少不能相同。
如果关联的对象已经存在于数据库中,
HTML 无法通过验证,或者在 ORM 关系中子对象不存在
像往常一样,参数传递给模型之前,在控制器中要过滤参数:
如果允许用户删除关联的对象,可以把
如果属性组成的 Hash 中包含
别忘了修改控制器中的参数白名单,允许使用
如果用户没有填写某些字段,最好将其忽略。此功能可以通过
Proc 对象。这个 Proc 对象会在通过表单提交的每一个属性 Hash 上调用。如果返回值为
Record 就不会为这个 Hash 构建关联对象。下面的示例代码只有当
为了方便,可以把
Proc 会拒绝为
Hash 构建对象。
我们往往不想事先显示多组字段,而是当用户点击“添加新地址”按钮后再显示。Rails 并没有内建这种功能。生成新的字段时要确保关联数组的键是唯一的,一般可在 JavaScript 中使用当前时间。
Person对象时还想让用户在同一个表单中创建多个地址(家庭地址,工作地址,等等)。以后编辑这个
Person时,还想让用户根据需要添加、删除或修改地址。
9.1 设置模型
Active Record 为此种需求在模型中提供了支持,通过 accepts_nested_attributes_for方法实现:
Person对象上创建
addresses_attributes=方法,用于创建、更新和删除地址(可选操作)。
9.2 嵌套表单
使用下面的表单可以创建 Person对象及其地址:
fields_for方法会为关联中的每个元素执行一遍代码块。如果没有地址,就不执行代码块。一般的作法是在控制器中构建一个或多个空的子属性,这样至少会有一组字段显示出来。下面的例子会在新建
Person对象的表单中显示两组地址字段。
fields_for方法拽入一个表单构造器,参数的名字就是
accepts_nested_attributes_for方法期望的。例如,如果用户填写了两个地址,提交的参数如下:
:addresses_attributesHash
的键是什么不重要,但至少不能相同。
如果关联的对象已经存在于数据库中,
fields_for方法会自动生成一个隐藏字段,
value属性的值为记录的
id。把
include_id: false选项传递给
fields_for方法可以禁止生成这个隐藏字段。如果自动生成的字段位置不对,导致
HTML 无法通过验证,或者在 ORM 关系中子对象不存在
id字段,就可以禁止自动生成这个隐藏字段。
9.3 控制器端
像往常一样,参数传递给模型之前,在控制器中要过滤参数:
9.4 删除对象
如果允许用户删除关联的对象,可以把 allow_destroy: true选项传递给
accepts_nested_attributes_for方法:
_destroy键,且其值为
1或
true,就会删除对象。下面这个表单允许用户删除地址:
_destroy:
9.5 避免创建空记录
如果用户没有填写某些字段,最好将其忽略。此功能可以通过 accepts_nested_attributes_for方法的
:reject_if选项实现,其值为
Proc 对象。这个 Proc 对象会在通过表单提交的每一个属性 Hash 上调用。如果返回值为
false,Active
Record 就不会为这个 Hash 构建关联对象。下面的示例代码只有当
kind属性存在时才尝试构建地址对象:
reject_if选项的值设为
:all_blank,此时创建的
Proc 会拒绝为
_destroy之外其他属性都为空的
Hash 构建对象。
9.6 按需添加字段
我们往往不想事先显示多组字段,而是当用户点击“添加新地址”按钮后再显示。Rails 并没有内建这种功能。生成新的字段时要确保关联数组的键是唯一的,一般可在 JavaScript 中使用当前时间。
相关文章推荐
- 杨毅:不够优秀就不要腆着脸继续占便宜
- 使用jaxws:server 还是使用jaxws:endpoint发布webservice
- 一句话证明你开始接触Python
- checkedListBoxd的使用。
- 织梦DedeCms获取当前页面URL地址的调用方法
- js设置、修改、获取、删除 cookie
- java排列组合实例
- No.1 Two Sum
- Android 半圆矩形的实现
- github常见问题【转自百度知道】
- 织梦DedeCms调用列表页、文章页评论数和收藏数代码
- Android控件GridView的使用
- Python学习笔记(零)-- Python简介
- 织梦DedeCms网站首页不生成html文件动态显示方法
- 整理:OJ 测试数据
- 开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀
- ssh连接管理iPhone
- ] *** Assertion failure in -[AFHTTPRequestSerializer 今天用AF的时候遇到了报这个错误
- 全平台的物联网连接服务,arduino、nodemcu、esp8266、pc、微信
- ext.net GridPanel 实现鼠标移动显示图片