Rails-Treasure chest2 嵌套表单;

  • 嵌套表单1-1
  • 嵌套表单1-多
  • 选日期时间的UI (一个jquery Plugin)
  • 拆除前后台css和js
  • Rich Editor
  • 批次编辑bulk Editing

嵌套表单1-1

核心知识点:ActiveRecord Nested Attributes

嵌套属性的功能可以让你在关联的记录上保存属性,通过父记录。默认这个功能是关闭的。

使用类方法 #accepts_nested_attributes_for( :小写类名 ), 开启这个功能后,会增加一个属性存入方法,

如  profiles_attributes=(attributes)

⚠️::autosave被添加到关联上,当user更新, profile也自动更新。

实例方法:

:allow_destroy, 如果是true,任何删除record的行为,attributes_hash中会带一个_destroy key和a value("1"或true),对应的id的记录会被删除。

情景:

给User一个Profile,用于储存用户个人资料,1对1的关系。

model这样设计的原因是为了节省数据库的查询量。

单独的resource编辑UI

  1. 编辑一个嵌套的路由
    •    resources :users do
           resource :profile, :controller => "user_profiles"
         end
  2. 单独的连接,单独的edit表单, 单独的controller

使用accepts_nested_attributes_for方法编辑嵌套表单

  1. 在User.rb上加上accepts_nested_attributes_for :profile
  2. 在users_controller.rb上,把profile_attributes加入参数白名单。
    • :profile_attributes => [:id, ...]
  3. 在users_controller.rb上,edit方法上如果@user的profile不存在则创建一个(用关联方法)
    • @profile = @user.profile || @user.create_profile
  4. 在views/users/edit.html.erb上,塞入更新profile的表格。
    • f.field_for :profile do |ff|

方法:field_for(record_name, record_object=nil, field_options = {} , &block)

创建一个类似form_for的和指定model对象相关的scope,但不会创建form标签。

用于在一个form表格内添加额外的model对象。

和form_for类似,会生成FormBuilder对象(关联着model对象)

但参数有2个record_name和record_object用于不同的功能:

  1. record_name:  用于fields。提交的values出现在params hash中的样子。最终提交给controller。
  2. record_object(可选):what default values are shown when the form the fields appear in is first displayed。(没弄明白,但不重要,忽略)

嵌套表单(1-to-many)

def new
  @event = Event.new
  @event.tickets.build

end

在new方法中,每多加一行@event.tickets.build。在生成的表格中就多一个ticket输入框。

admin/events/_form.html.erb

<%= f.fields_for :tickets do |ff| %>
  <div class="form-group">
    <%= ff.label :name %>
    <%= ff.text_field :name, :class => "form-control"%>
  </div>
<% end %>

def edit
  if @event.tickets.empty?
    @event.tickets.build
  end
end

如果没有tickes则编辑时,增加一个ticket的输入框。

如果想要在编辑页面,新增功能:

  1. 增加一个“新增票”的按钮。点击后新增ticket输入框,新增一个ticket
  2. 在每个ticket输入框下面,增加一个“删除这个票据”的按钮。点击后删除这个ticket

需要使用javascript来实现相关功能。

猜你喜欢

转载自www.cnblogs.com/chentianwei/p/9424995.html