一个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 ...
随机推荐
- STS中配置MyBatis代码生成器
1.STS工具菜单项Help > Eclipse Marketplace... 2.输入“mybatis”关键字搜索 3.选择MyBatis Generator 1.3.7进行安装 4.安装成功 ...
- 排序算法之快速排序(Quicksort)解析
一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个 ...
- WebService 工作原理及实例教程
一.WebService到底是什么? 先来看下标准的定义:Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统 ...
- 纸壳CMS替换默认实现
简介 纸壳CMS是一个开源免费的可视化内容管理建站系统,拖拽就可以轻松建网站. GitHub: http://github.com/SeriaWei/ZKEACMS 纸壳CMS在设计上使用的是ASP. ...
- Win(Phone)10开发第(1)弹,桌面和手机的扩展API,还我后退键
喜大普奔的win10 uap开发预览版终于出了,这次更新跟8.1的变化不是很大,但是将原本win8.1和wp8.1uap的分项目的形式,改为了整合成一个项目,经过一次编译打包成一个appx包,实现了无 ...
- ODP.NET 之 ExecuteNoQuery 执行 Merge into 返回值
当执行Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery时,如果sql语句是 merge into ...,则返回值表现不稳定, ...
- 935. Knight Dialer
A chess knight can move as indicated in the chess diagram below: . This time, we place o ...
- 哈夫曼树——c++
哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这个定 ...
- (2)特征点匹配,并求旋转矩阵R和位移向量t
include头文件中有slamBase.h # pragma once // 各种头文件 // C++标准库 #include <fstream> #include <vector ...
- Youke365_2_4 一处Sql注入漏洞以及一处任意文件删除
本文作者:X_Al3r Prat 0 自白 每一天都是新的一天.没啥吐槽的,步入正题 /system/category.php 文件一处Sql注入## 80-87行代码 $root_i ...