Ruby on rails Rails:使用嵌套表单同时保存父级和子级
我有一个事件模型和一个包模型:Ruby on rails Rails:使用嵌套表单同时保存父级和子级,ruby-on-rails,ruby,erb,Ruby On Rails,Ruby,Erb,我有一个事件模型和一个包模型: # event.rb belongs_to :organization, optional: true belongs_to :event_type, optional: true has_many :packages has_many :collaborations has_many :messages, through: :collaborations has_many :forms, through: :collaborations # package
# event.rb
belongs_to :organization, optional: true
belongs_to :event_type, optional: true
has_many :packages
has_many :collaborations
has_many :messages, through: :collaborations
has_many :forms, through: :collaborations
# package.rb
belongs_to :event
has_many :package_collaborations
has_many :collaborations, through: :package_collaborations
我希望用户能够使用如下嵌套表单同时创建事件和包:
这是我的两份表格:
#_event_form.rb (simplified for easier reading)
<%= form_for(event) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<br>
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: 'form-control' %>
</div>
<% if f.object.new_record? %>
<%= f.hidden_field :status, value: 'upcoming' %>
<% else %>
<div class="form-group">
<%= f.label :attendee_count %>
<%= f.number_field :attendee_count, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :status %>
<%= f.select :status, [['Upcoming','upcoming'],['Completed','completed']], {}, class: 'form-control' %>
</div>
<% end %>
<hr>
<div class="form-group required">
<%= f.label :started_at, 'Starts' %>
<div class='input-group date form_datetime'>
<% if event.started_at.present? %>
<%= f.text_field :started_at, class: 'form-control', value: event.started_at.strftime("%m/%d/%Y %H:%M %p") %>
<% end %>
</div>
</div>
<div class="form-group required">
<%= f.label :ended_at, 'Ends' %>
<div class='input-group date form_datetime'>
<% if event.ended_at.present? %>
<%= f.text_field :ended_at, class: 'form-control', value: event.ended_at.strftime("%m/%d/%Y %H:%M %p") %>
<% end %>
</span>
</div>
</div>
<%= f.hidden_field :platform_type, value: "a_platform" %>
<hr>
<%= render 'packages/package_form', event: @event %> # <--- Nested form here.
<div class="actions" id="listen-for-hover">
<%= f.submit 'Save', class: 'btn btn-primary', :id => "event-create-button" %>
</div>
<% end %>
#_package_form.rb
<%= form_for([@event, @package]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.hidden_field :kind, value: params[:kind] if f.object.new_record? %>
<div class="form-group required">
<%= f.label :Your_offer_?, "Your Offer?" %>
<%= f.text_area :offering, class: 'form-control', :placeholder => "e.g. Your logo on stuff" %>
</div>
<div class="form-group">
<%= f.label :notes %>
<%= f.text_area :notes, class: 'form-control', :placeholder => "Notes here" %>
</div>
<hr>
<div class="actions">
<%= f.submit 'Submit', class: 'btn btn-primary', id: 'package-submit-button', disabled: true %>
</div>
<% end %>
##_event_form.rb(简化以便于阅读)
#
#_包_form.rb
“例如,你在物品上的徽标”%>
“此处注释”%>
以这种方式使用表单会导致以下错误:
Extracted source (around line #3):
1 <%# remoteFlag = false %>
2 <%# remoteFlag = true if @event.title == "dummy event" %>
3 <%= form_for([@event, @package]) do |f| %>
4 <%= render 'shared/error_messages', object: f.object %>
提取的源代码(第3行附近):
1.
2.
3.
4.
显然,这是因为@event尚未创建,所以它没有ID。制作此嵌套表单的最佳方法是什么?此嵌套表单用于同时生成新事件/包(无ID的新对象)或通过在应用程序的另一部分中使用partial编辑现有的(有ID的现有对象)?您可以使用“build”方法在“Event”中创建空的“package”。上面有一个例子 例如
您可以使用“构建”方法在“事件”中创建空的“包”。上面有一个例子 例如
您需要添加
accepts_nested_attributes_for :package
到您的事件模型(在Event.rb中)。然后,在事件控制器的“新建”方法中,添加
@package = @event.packages.build
在您的表单中,您将需要使用字段_作为方法。在整个过程中,这里有一个优秀的Railscast:
如果你不熟悉Ryan Bates的铁路司机,我强烈建议你花点时间和他们在一起 您需要添加
accepts_nested_attributes_for :package
到您的事件模型(在Event.rb中)。然后,在事件控制器的“新建”方法中,添加
@package = @event.packages.build
在您的表单中,您将需要使用字段_作为方法。在整个过程中,这里有一个优秀的Railscast:
如果你不熟悉Ryan Bates的铁路司机,我强烈建议你花点时间和他们在一起 我输入了完全相同的代码行,得到了完全相同的错误:
没有路由匹配{:action=>“index”,:controller=>“packages”,:event\u id=>nil}缺少必需的键:[:event\u id]
问题是事件本身还没有创建,而且它也是IDless@Antonio你在问题中没有提到错误。错误是另一个问题。请确保您正在使用Event.new在控制器方法上创建一个新的“Event”。我强烈建议使用官方的RoR指南,因为它与您尝试实现的场景完全相同。我输入了完全相同的代码行,得到了完全相同的错误:没有路由匹配{:action=>“index”,:Controller=>“packages”,:Event\u id=>nil}缺少必需的键:[:event\u id]
问题在于事件本身尚未创建,而且它也IDless@Antonio你在问题中没有提到错误。错误是另一个问题。确保您正在使用Event.new
在控制器方法上创建一个新的“Event”。我强烈建议您使用官方RoR指南,因为它与您尝试实现的场景完全相同。