rails中一个窗体多个模型——fields_for

借助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

时间: 2024-10-13 12:23:27

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

c#在一个窗体的panel中添加另一个窗体

以下步骤实现将Form2放置在Form1中Panel中显示: (1)在Visual Studio中新建一个“Windows 窗体应用程序”项目 (2)在项目中添加窗体Form2,为演示效果,窗体的背景设置为Gray (3)在Form1上布置一个Panel控件 (4)Form1的窗体代码Form1.cs using System;using System.Windows.Forms; namespace WindowsFormsApplication1{    public partial cla

c#中在一个窗体中触发另一个窗体的事件

c#中在一个窗体中触发另一个窗体的事件 创建两个窗体,分别为form1,form2,在form1中添加控件textBox1和button1,创建一个form2的对象Form2 b = null; 在form2中添加button1,定义委托和事件 //定义委托 public delegate void MyDelegate(); //定义事件 public event MyDelegate MyEvent; 给form2中的button1添加消息相应函数并做修改 private void butt

rails中render 和 redirect_to的区别, each只能用在数组中,如果只有一个或者零个项,用each方法会报错undefined method `each&#39; for #...

在render中,即使有:action,那么也仅仅是取对应的view中的模板(html.erb)而已,所以这里即使浏览器中的url是/orders/xcreate,但是显示的界面是/app/views/orders/xshow的代码 def xcreate flash.now[:notice] = "bb" @order = Order.new(params[:order]) if @order.save flash[:notice] = "yes" render(

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

在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();          //  sAllPage.FormBorderStyle = FormBorderStyle.None;           // sAllPage.Dock = DockStyle.Fill;            sAllPage.TopLevel = false;            this.MainPanel.Controls.

WinForm窗体中如何在一个窗体中取到另一个窗体的值

例如我们定义两窗体,Form1和Form2,如何在Form2中取到Form1中的一个值呢? 解决方法: 我们可以在Form2的类MyClass中定义一个静态变量,例如 public static string a = " "; 然后给这个静态变量赋值,例如 a = lblname.text; 由于静态变量的作用范围可以跨类,所以在Form1的方法中我们可以直接使用Form2的类MyClas进行调用Form2的静态变量a MyClass.a; 这样就完成了WinForm中从一个窗体中取得

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

在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加在Model里面.) 第一步:引用下面这个命名空间 第二步:添加验证 第三步:启动调试,出现以下问题: 解决方法: 超链接中包含了解决这个问题的详细介绍,也就是通过Code First数据库迁移的方式让Entity Framework帮助我们自动调整数据库里面的架构. 解决这个问题最简单的方法就是将

RailsCast26 Hackers Love Mass Assignment rails中按params创建、更新model时存在的安全隐患

Mass assignment是rails中常用的将表单数据存储起来的一种方式.不幸的是,它的简洁性成了黑客攻击的目标.下面将解释为什么及如何解决. 上述表单为一个简单的注册表单.当用户填入name,点击提交时,一个新用户被创建.用户模型被如下定义: ruby create_table :users do |t| t.string :name t.boolean :admin, :default => false, :null => false end 当用户点击提交时,如下的action被执

【转】Windows 中不规则窗体的编程实现

一.序言 在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等.矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使用足矣.但在某些娱乐游戏程序中使用就略显呆板些了,这时若用不规则窗体替代原先的矩形窗体,将会使这类程序更添情趣.典型的例子有windows 自代的Media Player,新版本的Media Player有个控制面板的选项,选中这些面板,播放器就以选中的面板形状出现,这时的播放器比以前版本

只开启一个窗体和进程以及多线程的操作

只开启一个窗体: 1 Form1 F1 = null; 2 public Form2(Form1 f1) 3 { 4 InitializeComponent(); 5 F1 = f1; 6 } 7 8 private void Form2_FormClosed(object sender, FormClosedEventArgs e) 9 { 10 F1.Close(); 11 } 12 13 List<Form> list = new List<Form>();//建立一个可以存