Rails中嵌套表单的解决
什么是嵌套表单呢?举个简单的例子吧,比如你有两个表,一个User表,另一个Account表,他们是一对一的关系(也可以一对多等)。现在需要提交一个表单的时候同时提交User,Account对应的字段数据。在Rails中有一种简单的方法解决,分别使用了这些方法
accepts_nested_attributes_for
attr_accessible
fields_for
下面我们用代码进行说明一下。
class User < ActiveRecord::Basehas_one :account accepts_nested_attributes_for :account #注意添加这两行attr_accessible :account_attributesend
class Account<ActiveRecord::Base
belongs_to :user
class UsersController < ApplicationControllerdef new@user = User.new@user.account.build #不要遗漏enddef create@user = User.new(params[:user])if @user.save... endend
end
users/new.html.erb:
<% form_for @user do |f| %><%= f.text_field :name %><% f.fields_for :account do |pf| %> #注意这里<%= pf.text_field :age %><% end %><% end %>
这是一对一的情况,假设是一对多呢,如User has_many :accounts ; Account belongs_to :user这种情况下只要将对应的account改写成accounts,就ok了
一些深入参考:
http://robots.thoughtbot.com/post/52960938209/accepts-nested-attributes-for-with-has-many-through
http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
以上是Rails3中,如果在Rails4中使用了Using Strong Parameters ,参考这里
去掉model中的 attr_accessible :account_attributes
,在对应的controller中添加Strong Parameters的方法
http://www.railsexperiments.com/using-strong-parameters-with-nested-forms/
<%= form_for [:manage, @coupon], html: {multipart: true} do |f| %>
<div class="fields">
<div class="field">
<%= f.label :coupon_type %>
<%= f.select :coupon_type, Coupon::CouponType, {include_blank: "select coupon type"}, class: "ui dropdown" %>
</div>
<div class="field">
<%= f.label :total_count, "数量限制" %>
<%= f.text_field :total_count %>
</div>
</div>
<div class="ui segment">
<h4 class="ui header">CDKEY</h4>
<div class="fields">
<%= f.fields_for :cdkey do |c| %>
<div class="field">
<%= c.label :code, "cdkey 设置后可以输入该cdkey兑换优惠券" %>
<%= c.text_field :code %>
</div>
<div class="field">
<%= c.label :count, "该cdkey可以兑换的次数" %>
<%= c.text_field :count %>
</div>
<div class="field">
<%= c.label :start_at %>
<%= c.text_field :start_at, class: "datepicker" %>
</div>
<div class="field">
<%= c.label :end_at %>
<%= c.text_field :end_at, class: "datepicker" %>
</div>
<div class="field">
<label for="">Delete</label>
<div class="ui checkbox">
<%= c.check_box :_destroy, style: "display: hidden" %>
<%= label_tag "删除" %>
</div>
</div>
<% end %>
</div>
</div>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :description %>
<%= f.text_area :description, rows: 2 %>
</div>
<div class="fields">
<div class="field">
<%= f.label :start_time %>
<%= f.text_field :start_time, class: "datepicker" %>
</div>
<div class="field">
<%= f.label :end_time %>
<%= f.text_field :end_time, class: "datepicker" %>
</div>
</div>
<div class="fields">
<div class="field">
<%= f.label :active_days %>
<%= f.text_field :active_days %>
</div>
<div class="field">
<%= f.label :expiration_time %>
<%= f.text_field :expiration_time, class: "datepicker" %>
</div>
</div>
<div class="fields">
<div class="field">
<%= f.label :value %>
<%= f.text_field :value %>
</div>
<div class="field">
<%= f.label :status %>
<%= f.select :status, Coupon::STATUS, {}, class: "ui dropdown" %>
</div>
</div>
<div class="fields">
<div class="field">
<%= f.label :no_prefix %>
<%= f.text_field :no_prefix %>
</div>
</div>
<div class="ui segment">
<h4 class="ui header">Can use countries</h4>
<div class="ui grid">
<div class="ui wide column">
<div class="ui checkbox">
<%= check_box_tag "coupon[countries_limit][]", "all", @coupon.countries_limit.to_a.include?("all"), style: "display: hidden" %>
<%= label_tag "all" %>
</div>
</div>
<% SupportCountry.all.each do |sc| %>
<div class="ui wide column">
<div class="ui checkbox">
<%= check_box_tag "coupon[countries_limit][]", sc.iso_code, @coupon.countries_limit.to_a.include?(sc.iso_code), style: "display: hidden" %>
<%= label_tag sc.iso_code %>
</div>
</div>
<% end %>
</div>
</div>
<div class="field">
<button class="ui submit blue button" type="submit" name="action">
Submit
</button>
</div>
<% end %>
</div>
<div class="field">
<%= c.label :code, "cdkey 设置后可以输入该cdkey兑换优惠券" %>
<%= c.text_field :code %>
</div>
<div class="field">
<%= c.label :count, "该cdkey可以兑换的次数" %>
<%= c.text_field :count %>
</div>
<div class="field">
<%= c.label :start_at %>
<%= c.text_field :start_at, class: "datepicker" %>
</div>
<div class="field">
<%= c.label :end_at %>
<%= c.text_field :end_at, class: "datepicker" %>
</div>
<div class="field">
<label for="">Delete</label>
<div class="ui checkbox">
<%= c.check_box :_destroy, style: "display: hidden" %>
<%= label_tag "删除" %>
</div>
</div>
<% end %>
@coupon = Coupon.find(params[:id])
if @coupon.cdkey.present?
@cdkey =@coupon.cdkey
else
@cdkey = @coupon.build_cdkey
end
end
@coupon = Coupon.find(params[:id])
if @coupon.update(coupon_params)
redirect_to manage_coupons_path
end
end
def coupon_params
params.require(:coupon).permit(
:name, :coupon_type, :value, :description, :start_time, :end_time,
:active_days, :expiration_time, :status, :no_prefix, :total_count, cdkey_attributes: [:id, :code, :start_at, :end_at, :count, :_destroy],
countries_limit: []
)
end
Rails中嵌套表单的解决相关推荐
- extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...
Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...
- layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值
咋说呢,因为对 layui 不太熟悉,这个弹出框搞了好久,看了好多解决方案,大致尝试了一下其中几种,在坑中无法自拔...总之终于搞出来了,在这里分享一下我的笔记. 着急的直接 戳这里 看解决代码. 尝 ...
- vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件
使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...
- form表单、控制器中接收表单提交数据的4种方式
Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...
- table中加表单元素怎么验证_el-table嵌入表单元素注意事项(验证规则prop写法与数据初始化)...
场景:在el-table表格中嵌入表单元素 绑定数据: table : :data="planFormData.allocationPlan" el-form-item: v-mo ...
- html5如何提交到邮箱,如何在html网页中提交表单直接发送到邮箱
如何在html网页中提交表单直接发送到邮箱?此问题一直困扰了我很久很久,后来了解到jmail组件可以解决此问题,而且现在的付费空间基本都会有此组件.分别建立表单页和asp页面,提交表单后通过asp页面 ...
- antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证
一.项目要求 1.要求:点击新增按钮弹出新增页面,在输入名称时进行验证,当输入名称和列表下的名称相同,即后台数据库中存在,此时将会提醒用户,该名称已存在, 2.要求:该名称不存在,则新增成功 二.思路 ...
- Element UI 表格嵌套表单、输入框、选择框
Element UI 表格嵌套表单.输入框.选择框 有时候我们需要一次添加多条数据,这个时候我们就可以使用表格嵌套表单.输入框和选择框等等的方式,添加保存和修改数据. 直接展示代码 <el-fo ...
- 在WPSOFFICE表格中插入表单域(转)
在WPSOFFICE表格中插入表单域(转) 不知是软件的BUB或是其他什么原因,笔者发现在WPS OFFICE的表格中无法插入表单域(在通常情况下,表单域放在表格中更易于组织和显示信息),怎样解决这个 ...
最新文章
- 用eclipse创建WebService Step by Step
- 动态链接库编写与使用(VC6)
- 最详细支付宝接口申请、使用!!!带详细流程--实践--支付宝当面付申请
- BIOS中的分区工具
- 【01】 课程介绍 - 计算机视觉概述
- 单链表的插入操作的实现(0952)SUWST-OJ
- 动与静--软件的雕塑艺术
- 基于C语言实现NDVI处理
- windows10批量解压缩文件-用WinRAR
- php拼音转为汉字方法二
- 基于深度学习安卓端烟雾和火焰检测开发总结
- excel mmult matlab,如何用excle计算矩阵/在EXCEL中如何计算矩阵行列式
- 2017.7.14 阿里巴巴校招面经
- 腾讯微云和坚果云哪个好用?
- 【新手必看系列】小鸟云服务器该如何配置?
- php百分比乘加,PHP学习笔记第一篇 基础知识
- opencv中waitKey()的作用
- (三)四种流行的RPC框架(Dubbo/Motan/Thrift/Grpc)
- 文件上传漏洞及解析漏洞总结
- 哈尔滨计算机动漫游戏学校,动漫设计_哈尔滨双星计算机职业技术学校