Rails-单个属性的多个条目 [英] Rails - Multiple entries for a single attribute
问题描述
我正在使用rails 4制作一个应用程序。我使用简单的表单。
我有个人资料模型和资格模型。
关联如下:
profile.rb
belongs_to :profile
资格.rb
has_many :qualifications
我的个人资料视图中有一个表单,其中包括来自我的资格视图的表单的一部分。
配置文件#表
<%= simple_form_for(@profile) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="row">
<div class="intpol2">
Your professional qualifications
</div>
<%= render 'qualifications/form', f: f %>
</div>
资历#表
<%= simple_fields_for :qualification do |f| %>
<div class="form-inputs">
<div class="row">
<div class="col-md-6">
<%= f.input :title, :label => "Your award" %>
</div>
<div class="col-md-6">
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
</div>
<div class="col-md-6">
<%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
</div>
</div>
用户可以拥有多个学位。我要添加一个按钮,该按钮会显示‘添加另一个资格’,然后就会有一组新的资格表域可用。
我发现这篇文章试图做一些略有不同的事情。我不想要10组空白的表单域(这会使表单看起来太长)。
Creating multiple records for a model in a single view in Rails
有没有其他方法可以实现这一点?
推荐答案
您将寻找一个名为cocoon
的宝石;您也可以观看this Railscast (Nested forms
),它非常过时,但仍然很好地解释了它的结构。
该模式非常简单,但需要一些额外的部分:
- 有一个调用控制器的AJAX按钮
- 控制器需要返回一个表单并构建
fields_for
- 您将使用JS将新的
fields_for
追加到原始表单
最大的问题是您的新fields_for
-此模式的新实现使用child_index: Time.now.to_i
我已经就此写过here。
这是一个新版本:
AJAX
首先,您需要一个"添加资格"按钮,它通过AJAX链接到您的控制器:
#app/views/profiles/_form.html.erb
<%= simple_form_for(@profile) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="row">
<div class="intpol2">Your professional qualifications</div>
<%= render 'qualifications/form', f: f %>
</div>
</div>
<%= button_to "+", new_profile_path, method: :get %>
<% end %>
控制器
这将通过new控制器方法,我们应该能够管理该方法以返回对AJAX请求的特定响应:
#app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController
respond_to :js, :html, only: :new
def new
@profile = Profile.new
@profile.qualifications.build
respond_with @profile #-> will invoke app/views/profiles/new.js.erb
end
end
响应
启动new.js.erb
后,我们需要生成新的HTML表单,提取fields_for
并将其追加到您的视图中:
#app/views/profiles/new.js.erb
var fields_for = $("<%=j render "profiles/form" %>").html(); //-> might need tweaking
$(fields_for).appendTo("#new_profile.form-inputs");
CHILD_INDEX
您还应该将qualifications/form
更改为包括child_index
:
#app/views/qualifications/form.html.erb
<%= simple_fields_for :qualifications, child_index: Time.now.to_i do ...
子索引用于表示fields_for
元素中的index
。在我们的情况下(因为我们正在创造所有的新记录),这并不重要。使用Time.now.to_i
可确保每次都有一个完全唯一的id
。
最后,您需要确保您是在呼叫:
<%= simple_fields_for :qualifications ... %>
...复数
这篇关于Rails-单个属性的多个条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!