什么是嵌套表单呢?举个简单的例子吧,比如你有两个表,一个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/

实例1:
coupon.rb中:
accepts_nested_attributes_for :cdkey, allow_destroy: true
作用是添加一对一cdkey表单的嵌套
_form.html.erb中:
div class="ui form">
  <%= 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>

注意:          <%= 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 %>

这一段为对嵌套表单的提交
coupon_controller.rb中:
def edit
    @coupon = Coupon.find(params[:id])
    if @coupon.cdkey.present?
      @cdkey  =@coupon.cdkey
    else
      @cdkey = @coupon.build_cdkey
    end
  end
def update
    @coupon = Coupon.find(params[:id])
    if @coupon.update(coupon_params)
      redirect_to manage_coupons_path
    end
  end
private
  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
注意:edit中的@cdkey = @coupon.build_cdkey这句和coupon_params健壮参数中 cdkey_attributes: [:id, :code, :start_at, :end_at, :count, :_destroy],这句

Rails中嵌套表单的解决相关推荐

  1. extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...

    Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...

  2. layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

    咋说呢,因为对 layui 不太熟悉,这个弹出框搞了好久,看了好多解决方案,大致尝试了一下其中几种,在坑中无法自拔...总之终于搞出来了,在这里分享一下我的笔记. 着急的直接 戳这里 看解决代码. 尝 ...

  3. vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...

  4. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  5. table中加表单元素怎么验证_el-table嵌入表单元素注意事项(验证规则prop写法与数据初始化)...

    场景:在el-table表格中嵌入表单元素 绑定数据: table : :data="planFormData.allocationPlan" el-form-item: v-mo ...

  6. html5如何提交到邮箱,如何在html网页中提交表单直接发送到邮箱

    如何在html网页中提交表单直接发送到邮箱?此问题一直困扰了我很久很久,后来了解到jmail组件可以解决此问题,而且现在的付费空间基本都会有此组件.分别建立表单页和asp页面,提交表单后通过asp页面 ...

  7. antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证

    一.项目要求 1.要求:点击新增按钮弹出新增页面,在输入名称时进行验证,当输入名称和列表下的名称相同,即后台数据库中存在,此时将会提醒用户,该名称已存在, 2.要求:该名称不存在,则新增成功 二.思路 ...

  8. Element UI 表格嵌套表单、输入框、选择框

    Element UI 表格嵌套表单.输入框.选择框 有时候我们需要一次添加多条数据,这个时候我们就可以使用表格嵌套表单.输入框和选择框等等的方式,添加保存和修改数据. 直接展示代码 <el-fo ...

  9. 在WPSOFFICE表格中插入表单域(转)

    在WPSOFFICE表格中插入表单域(转) 不知是软件的BUB或是其他什么原因,笔者发现在WPS OFFICE的表格中无法插入表单域(在通常情况下,表单域放在表格中更易于组织和显示信息),怎样解决这个 ...

最新文章

  1. 用eclipse创建WebService Step by Step
  2. 动态链接库编写与使用(VC6)
  3. 最详细支付宝接口申请、使用!!!带详细流程--实践--支付宝当面付申请
  4. BIOS中的分区工具
  5. 【01】 课程介绍 - 计算机视觉概述
  6. 单链表的插入操作的实现(0952)SUWST-OJ
  7. 动与静--软件的雕塑艺术
  8. 基于C语言实现NDVI处理
  9. windows10批量解压缩文件-用WinRAR
  10. php拼音转为汉字方法二
  11. 基于深度学习安卓端烟雾和火焰检测开发总结
  12. excel mmult matlab,如何用excle计算矩阵/在EXCEL中如何计算矩阵行列式
  13. 2017.7.14 阿里巴巴校招面经
  14. 腾讯微云和坚果云哪个好用?
  15. 【新手必看系列】小鸟云服务器该如何配置?
  16. php百分比乘加,PHP学习笔记第一篇 基础知识
  17. opencv中waitKey()的作用
  18. (三)四种流行的RPC框架(Dubbo/Motan/Thrift/Grpc)
  19. 文件上传漏洞及解析漏洞总结
  20. 哈尔滨计算机动漫游戏学校,动漫设计_哈尔滨双星计算机职业技术学校

热门文章

  1. struts1 异常
  2. ISO20000与ISO27001有哪些区别?
  3. 安装2019Pycharm最新版本-详细教程--激活码
  4. 浏览github等学术网站太卡?推荐使用steam ++(别名Watt Tookit)
  5. python的扩展控制鼠标
  6. echart柱状图偏移位置设置
  7. Oracle文件的导出
  8. 解决JDBC-ODBC驱动桥导致JVM crash.
  9. Android WebView 调用JS方法获取返回值
  10. 微软实习面试经历-2018