详细参考

http://railscasts.com/episodes/73-complex-forms-part-1中part-1、2、3部分

借助field_for可以生成表单来处理两个或更多模型对象的数据

先看一个官方的例子,一个表单中有person和permission两个模型,其中每个person包含一个permission

<%= form_for(@person) do |person_form| %>
First name: <%= person_form.text_field :first_name %>
Last name: <%= person_form.text_field :last_name %> <% fields_for :permission, @person.permission do |permission_fields| %>
Admin : <%= permission_fields.check_box :admin %>
<% end %>
<% end %>

当一个person包含多个permission时,view代码如下

<%= form_for(@person) do |person_form| %>
First name: <%= person_form.text_field :first_name %>
Last name: <%= person_form.text_field :last_name %> <% for permission in @person.permissions %>
<%= fields_for "permission[]", permission do |permission_fields| %>
Admin : <%= permission_fields.check_box :admin %>
<% end %>
<% end %>
<% end %>

1、其中"permission[]"保证了多个permission对象id不同,都包含在param[]中

2、此时,param[:person]={:first_name => v, :last_name => v, :permission1=>v, :permission2 => v...}

3、<%=person_form.fields_for "permission[]", permission do |permission_fields| %>时,

param[:person]={:first_name => v, :last_name => v, :persom=>{:permission1=>v, :permission2 => v...}}

model代码

# models/.person.rb
def permission_attributes=(permission_attributes)
permission_attributes.each do |attributes|
permissions.build(attributes)
end
end

为了对应view里面的permission[]

controller里的create方法

# persons_controller.rb
def new
@person= person.new
3.times { @person.permissions.build }
end def create
@person= Person.new(params[:project)
if @person.save
flash[:notice] = "Successfully created project."
redirect_to persons_path
else
render :action => 'new'
end
end

rails中一个窗体多个模型——fields_for的更多相关文章

  1. WinForm中一个窗体调用另一个窗体

    [转] WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码) //如果想打开一个 Form2 的窗体类,只需要: Form2 form = new Form2(); //有没有参数得看 ...

  2. ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了

    ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了 解决方法: 按 alt + 回车  键直接就返回去了

  3. 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了

    系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...

  4. c# winform 在一个窗体中使用另一个窗体中TextBox控件的值——解决办法

    [前提]一个winform应用程序项目中,窗体B,需要使用 窗体A 中一个TextBox控件的值,进行计算等操作. [解决方案] 1.在窗体A中定义:public static double a;// ...

  5. ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]

    ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...

  6. Winforn中怎样在窗体中打开另一个窗体

    场景 在Winform的窗体A中打开另一个窗体B. 实现 //打开新的窗体 CurveCompare cc = new CurveCompare(); cc.Show(); 效果 以上代码的实现参照: ...

  7. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...

  8. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

  9. rails 中 create, new, build, save 的用法以及误区汇总

    自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源 ...

随机推荐

  1. go语言之接口一

    在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 我们定义了一个File类,并实现有Read().Write().Seek().Close()等方法.设 想我们有如下接口 ...

  2. 【深度学习】ubuntu16.04下安装opencv3.4.0

    1.首先安装一些编译工具 # 安装编译工具 sudo apt-get install build-essential # 安装依赖包 sudo apt-get install cmake git li ...

  3. windows下的mysql闪退问题

    早上来启动MySQL发现输入密码就闪退,连续试了好几次,最后到网上查到了解决方案. 与Linux系统下MySQL密码丢失的操作步骤基本一样. 首先要跳过密码启动MySQL服务. 启动服务必须使用全路径 ...

  4. python字符串格式和编码与解码问题

    %c 转换成字符(ASCII码值,长度为一的字符串) %r 有线使用repr()函数进行字符串转换 %s 有线使用str()函数进行字符串转换 %d or %i 转换成有符号十进制数 %u 转换成无符 ...

  5. 【leetcode刷题笔记】Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  6. css3图片过滤效果

    在线演示 本地下载

  7. 斯坦福机器学习视频笔记 Week3 逻辑回归与正则化 Logistic Regression and Regularization

    我们将讨论逻辑回归. 逻辑回归是一种将数据分类为离散结果的方法. 例如,我们可以使用逻辑回归将电子邮件分类为垃圾邮件或非垃圾邮件. 在本模块中,我们介绍分类的概念,逻辑回归的损失函数(cost fun ...

  8. EntityFramework 学习 一 DbSet

    DBSet类表示一个实体的集合,用来创建.更新.删除.查询操作,DBSet<TEntity>是DBSet的泛型版本 你可以使用DbContext获取DBSet的引用,例如dbContext ...

  9. Drools Fusion (CEP) Example 和 关键概念

    Drools Fusion (Complex Event Processing) 是Drools对于复杂事件处理的模块, 与它功能相似的是Esper, 两者都可以提供基于时间跨度和滑动窗口的事件处理, ...

  10. Qt 怎么画一个圆角矩形对话框,或者圆角控件

    1. 2. 在自定义控件的 构造函数中加入如下一段断码 this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); //隐藏对话框标题 ...