一个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 ...
随机推荐
- [Ubuntu]管理开机启动项的软件
sudo apt-get install sysv-rc-conf
- LeetCode140:Word Break II
题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...
- telerik自定义皮肤的制作及用法
1. 打开telerik 官网 http://stylebuilder.telerik.com/ 2. 选择一个皮肤做为基础皮肤,并选择要制作的控件,并新取一个名字.比如选择皮肤Silk为基础皮肤,新 ...
- SQL处理数据并发,解决ID自增
1 创建MaxIdProcess表,由于存储ID的最大值 CREATE TABLE [dbo].[MaxIdProcess]( ,) NOT NULL, --自增ID ) NOT NULL, --存储 ...
- Algebraic Kernel ( Arithmetic and Algebra) CGAL 4.13 -User Manual
1 Introduction Real solving of polynomials is a fundamental problem with a wide application range. T ...
- 记录FormsAuthentication的使用方法
配置,配置mode="Forms",其他属性详见 MSDN(点我直接查看各authentication属性) . <configuration> <system. ...
- RxJS入门之函数响应式编程
一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: fun ...
- Java基础学习篇---------继承
一.覆写(重写) 1.含义:子类的定义方法.属性和父类的定义方法.属性相同时候 方法名称相同,参数相同以及参数的个数也相同,此时为覆写(重写) 扩充知识点: 覆盖:只有属性名字和方法名字相同,类型.个 ...
- 欢迎使用CSDN-markdown编辑器u
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- hdoj1068 Girls and Boys(二分图的最大独立集)
题意:有n个人,要彼此认识.选择一个集合,使得集合里的每个人相互不认识.求集合中人数的最大值. 求二分图的最大独立集. 公式:最大独立集=顶点数-最大匹配 这个题目中因为集合是一个,所以求出最大匹配数 ...