一个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 ...
随机推荐
- hsweb 企业后台管理基础框架
hsweb 详细介绍 业务功能 现在: 权限管理: 权限资源-角色-用户. 配置管理: kv结构,自定义配置.可通过此功能配置数据字典. 脚本管理: 动态脚本,支持javascript,groovy, ...
- 利用HttpWebRequest模拟表单提交
using System; using System.Collections.Specialized; using System.IO; using System.Net; using System. ...
- (zxing.net)一维码MSI的简介、实现与解码
一.简介 MSI/Plessey 条码(也被称为 MSI 或 Modified Plessey)是一款数字条码,多用于超市.存储用的仓库和其他贮藏室的货架.货架上的条码可以告知货架上的产品.应放数量和 ...
- C#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点
HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...
- 使用FFMpeg命令行录屏推rtmp流
最近在做局域网内屏幕分享方面的东西,要把录制一台设备的屏幕然后实时推送给内网的一个或多个用户. 做了很多实验,效果还没有达到要求,这里分享一下推rtmp流的实验. 实验使用到的各种工具:FFmpeg. ...
- 使用cropper插件进行图片裁剪 并上传
cropper插件的使用和 github地址: github 官方实例 我参考的中文文档: https://www.cnblogs.com/baka-sky/p/8001577.html 因为我是.n ...
- 数据库的完整性约束(ForeignKey ,Unique)
文字转自于 海燕.博客 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 ...
- Django 使用getattr() 方法获取配置文件的变量值
在django项目的开发过程中,有时需要获取配置文件里的变量值,可以通过下面这样的方式去进行获取 from django.conf import settings item = getattr(set ...
- 操作实践题 - HTML 列表综合应用
通过对列表的综合应用,编写如下效果网页: 解答: <html> <head> <title>操作实践题</title> <meta http-eq ...
- 【已解决】wepy中使用分包加载报错
问题: "xxx.js 出现脚本错误后者未正确调用Page()" 最近看小程序启动时间(性能监控),启动时间比较长,所以考虑使用分包加载. 但在使用过程中遇 ...