有计算器上轨左右复杂的形式,他们都似乎指向对这个问题Ryan Bates的不错railscast演示了很多问题: 第1部分和第2部分 。
这是伟大的它做什么,但我不明白的问题解决,你可能需要创建新的儿童的状况对象,或者您可能希望已经存在的对象相关联。
在我来说,我希望用户能够创建一个新的事件。 作为其中的一部分,他们需要说谁参与了这一事件。 大约有一半的时间,人加入到事件在数据库已经存在。 在这种情况下,用户应鼓励使用这些现有记录VS创建新的。
如何处理这种形式的复杂性有什么建议?
而作为解决方案的一部分,你建议,如果用户没有找到该应用程序继续运行并前的父对象被提交创建它在飞行的人吗? 我的想法(不过感兴趣的听证会的建议)是,如果有一个,但用户应该使用现有的人员记录,如果用户需要创建新的联系人记录,这个新的记录不会提交到数据库,直到用户提交的事件。 思考?
喜来完成你需要做的,有几个简单的步骤如下:1)在模型类(事件和人物类,你的情况),请确保你把这样的事情:
class Incident < ActiveRecord::Base
has_and_belongs_to_many :people
# Note if you want to be able to remove a person from the Incident form (to de-associate) put true in :allow_destroy => true on the accepts_nested_attributes_for
accepts_nested_attributes_for :people, :allow_destroy => false, :reject_if => :all_blank
validates_associated :people #so you won't be able to save invalid people objects
attr_accessible :date_occur, :location, :people_attributes # note the :people_attributes here
#do your Incident validations as usual...
end
class Person < ActiveRecord::Base
has_and_belongs_to_many :incidents
#the following line it's to allow mass assignment, basically it will allow you to create people from the Incident form
attr_accessible :first_name, :last_name, :dob
#do your Person validations as usual...
end
2)在观察侧,最简单的方法将是修改事件表单文件(应用程序/视图/事件/ _form.html.erb),以允许用户指定现有的和创造新人们的事件:
# app/view/incidents/_form.html.erb
<%= semantic_form_for(@incident) do |f| %>
<% if @incident.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@incident.errors.count, "error") %> prohibited this incident from being saved:</h2>
<ul>
<% @incident.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :date_occur %><br />
<%= f.datetime_select :date_occur %>
</div>
<div class="field">
<%= f.label :location %><br />
<%= f.text_field :location %>
</div>
<%= f.input :people, :as => :select, :collection=>Hash[Person.all.map { |p| [p.first_name + ' - ' + p.last_name, p.id] }] %>
<%= f.fields_for :people, Person.new() do |new_person_form| %>
<div class="incident-people new-person">
<%= new_person_form.inputs :name=>'Add New person' do %>
<%= new_person_form.input :first_name, :label=>'First Name: ' %>
<%= new_person_form.input :last_name, :label=>'Last Name: ' %>
<%= new_person_form.input :dob, :label=>'Date of birth: ' %>
<% end %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
3)最后,您需要修改您的更新,并为事件控制器如下方法:
# app/controllers/incident_controller.rb
def create
selected_people = params[:incident][:person_ids].keep_if{ |v| v.present? }
params[:incident].delete(:person_ids)
@incident = Incident.new(params[:incident])
@incident.people = Person.find( selected_people )
respond_to do |format|
if @incident.save
format.html { redirect_to @incident, notice: 'Incident was successfully created.' }
format.json { render json: @incident, status: :created, location: @incident }
else
format.html { render action: "new" }
format.json { render json: @incident.errors, status: :unprocessable_entity }
end
end
end
def update
selected_people = params[:incident][:person_ids].keep_if{ |v| v.present? }
params[:incident].delete(:person_ids)
@incident = Incident.find(params[:id])
@incident.people = Person.find( selected_people )
respond_to do |format|
if @incident.update_attributes(params[:incident])
format.html { redirect_to @incident, notice: 'Incident was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @incident.errors, status: :unprocessable_entity }
end
end
end
就是这样,让我知道如果你需要进一步的帮助。 联邦快递
文章来源: How do I build a complex form in rails which allows me to associate or create a new related entity?