一个ruby on rails项目,用户和公司的模型都有地址。
我要创建一个地址表,包含用户和公司表的引用,比直接做下去要好一点,这回让我的数据库设计保持干净。
我的第一印象是,这似乎很难实现,外面所有的讨论及教程都只说明了在model如何设置,但是并没有说明在controller和view如何使用它。我好一顿放狗,也没有得到太多的帮助。
令我感到惊喜是其实在rails设置并使用多态表单是很简单的。
首先依然是先设置model结构:
01 |
class Company< ActiveRecord::Base |
02 |
has_one :address , :as =>; :addressable , :dependent => :destroy |
05 |
class User < ActiveRecord::Base |
06 |
has_one :address , :as => :addressable , :dependent => :destroy |
09 |
class Address < ActiveRecord::Base |
10 |
belongs_to :addressable , :polymorphic => true |
接下来是创建一个Address表来保存地址:
01 |
class CreateAddresses < ActiveRecord::Migration |
03 |
create_table :addresses do |t| |
04 |
t.string :street_address1 , :null => false |
05 |
t.string :street_address2 |
06 |
t.string :city , :null => false |
07 |
t.string :region , :null => false |
08 |
t.string :postcode , :null => false , :limit => 55 |
09 |
t.integer :addressable_id , :null => false |
10 |
t.string :addressable_type , :null => false |
接下来是controller,你只需要修改controller中的"new","create","edit","update"四个action,好让需要的时候可以访问和修改address。
01 |
class CompaniesController < ApplicationController |
04 |
@company = Company. new |
05 |
@company .address = Address. new |
09 |
@company = Company.find(params[ :id ]) |
10 |
@company .address = Address. new unless @company .address != nil |
14 |
@company = Company. new (params[ :company ]) |
15 |
@company .address = Address. new (params[ :address ]) |
19 |
flash[ :notice ] = 'Company was successfully created.' |
22 |
render :action => 'new' |
27 |
@company = Company.find(params[ :id ]) |
29 |
if @company .update_attributes(params[ :company ]) |
30 |
@company .address.update_attributes(params[ :address ]) |
31 |
flash[ :notice ] = 'Company was successfully updated.' |
34 |
render :action => 'edit' |
最后一件事是让address在表单中可以正常工作,我们这里使用field_for方法:
01 |
<% form_for( @company ) do |f| %> |
02 |
<%= f.error_messages %> |
04 |
<%= f.text_field :name %> |
05 |
<%= f.text_field :telephone %> |
06 |
<%= f.text_field :fax %> |
07 |
<%= f.text_field :website_url %> |
10 |
<% fields_for( @company .address) do |address_fields| %> |
11 |
<%= address_fields.hidden_field :addressable_id %> |
12 |
<%= address_fields.hidden_field :addressable_type %> |
14 |
<%= address_fields.text_field :street_address1 %> |
15 |
<%= address_fields.text_field :street_address2 %> |
16 |
<%= address_fields.text_field :city %> |
17 |
<%= address_fields.text_field :region %> |
18 |
<%= address_fields.text_field :postcode %> |
到这就应该可以正常工作了。
有人要问了,如果我去的了address对象,能否反向取得Company或者User对象呢?答案当然是肯定的。
1 |
@address = Address.find(params[ :id ]) |
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- 阻止form空表单提交----JavaScript
网上看到很不错的阻止form空表单提交 第一种方法 <div class="warp"> <h2>登录到pfan空间</h2> <p> ...
- form注册表单圆角 demo
form注册表单圆角 <BODY> <div class="form"> <ul class="list"> <li& ...
- Form提交表单页面不跳转
1.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- 使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- WP Mail SMTP插件解决Contact Form 7表单提交失败问题
WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线 ...
- 关于form与表单提交操作的一切
原文链接:http://caibaojian.com/form.html 你知道,一个表单里面只要有form元素,如果没有给action加一个默认值,为空白的时候,当你刷新页面时,会弹出一个警告框提示 ...
- 【转】document.form.action,表单分向提交
document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现 ...
- js jquery, jquery-ui 获取form各种表单input的值?
如何获取? make up (for): 弥补, 补偿, her beaty cannot make up for her stu'pidity. five Basic laws of human s ...
随机推荐
- Python学习-41.Python中的断言
先来点题外话: 在现代编程开发中,TDD(测试驱动开发)变得越来越流行(PS:DDD(领域驱动开发)也是,但两者并不冲突,就像面向过程和面向对象).而作为TDD的根本——单元测试也是越来越重要,单元测 ...
- LayaAir从入门到放弃
我是一个小白程序员,准备开发小程序找了很久小程序开发引擎,看到白鹭和LayaAir .经过一番资料查找后被LayaAir高性能.接口简洁及社区活跃所吸引,然后选择了LayaAir. 开发过程中一般小问 ...
- UWP开发入门(六)——对多设备不同分辨率显示效果的讨论
本篇不涉及具体代码,而是把实际开发UWP APP的过程中,遇到的不同设备,不同分辨率显示效果差异的问题进行讨论.希望能够抛砖引玉,和各位擦出一些火花. 蜀黍我目前是在做一套牛逼的UWP APP啦,目标 ...
- rabbitMQ的简单实例——amqp协议带数据回写机制
rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...
- day 76 滑动窗口 ,头像上传
一.上传文件 前端html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Day 18 正则表达式.
一.字符 .匹配除换行符以外的任意字符. \w 匹配字母数字或者下划线. \s 匹配任意的空白符 \d 匹配数字 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字符串的开始. $ 匹配字符串的结 ...
- 2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-2 20175306实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先 ...
- Math-645. Set Mismatch
The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ...
- 本机的虚拟机执行ifconfig,显示不出ip的解决方法
源于:https://blog.csdn.net/fuweihua123/article/details/78423715?locationNum=4&fps=1 本机的虚拟机执行ifconf ...
- (4)Oracle基础--操作表中数据
· 添加数据 <1> INSERT 语句 ① 向表中所有字段添加值 语法: INSERT INTO table_name (column1,column2...) VALUES(val ...