- 嵌套表单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
- 编辑一个嵌套的路由
-
resources :users do resource :profile, :controller => "user_profiles" end
-
- 单独的连接,单独的edit表单, 单独的controller
使用accepts_nested_attributes_for方法编辑嵌套表单
- 在User.rb上加上accepts_nested_attributes_for :profile
- 在users_controller.rb上,把profile_attributes加入参数白名单。
- :profile_attributes => [:id, ...]
- 在users_controller.rb上,edit方法上如果@user的profile不存在则创建一个(用关联方法)
- @profile = @user.profile || @user.create_profile
- 在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用于不同的功能:
- record_name: 用于fields。提交的values出现在params hash中的样子。最终提交给controller。
- 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的输入框。
如果想要在编辑页面,新增功能:
- 增加一个“新增票”的按钮。点击后新增ticket输入框,新增一个ticket
- 在每个ticket输入框下面,增加一个“删除这个票据”的按钮。点击后删除这个ticket
需要使用javascript来实现相关功能。