2017-04-06 80 views
1

我有一個事件模型和封裝模式同時存在:的Rails:保存親子嵌套形式

# 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 

我希望用戶能夠創建在同一時間的事件和封裝與嵌套形成這樣的:

[IMAGE]

這是我的兩種形式:

#_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 %> 

使用表單這樣會導致這個錯誤:

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 %> 

顯然,這是因爲@event還沒有被創建,所以沒有爲它的ID。什麼是最好的方法來使這個嵌套的表單,用於同時創建新的事件/包(新的沒有ID的對象)或編輯現有的(帶有ID的現有對象)通過使用部分在另一部分應用程序嗎?

回答

0

您可以使用'build'方法在'event'中創建一個空的'包'。有一個例子在official RoR guides

例如,

<%= form_for([@event, @event.packages.build]) do |f| %> 
+0

我輸入了完全相同的代碼行,並得到相同的確切錯誤: '沒有路由匹配{:action =>「index」,:controller =>「packages」,:event_id => nil}鍵:[:event_id] ' – Antonio

+0

問題是事件本身還沒有創建,它也是IDless – Antonio

+0

@Antonio你沒有提到問題中的錯誤。錯誤是一個不同的問題。確保你使用'Event.new'在Controller方法上創建了一個新的'Event'。我強烈建議使用RoR官方指南,因爲它與你試圖實現的完全相同。 –

0

您需要

accepts_nested_attributes_for :package 

添加到您的事件模型(event.rb)。然後,在你的事件控制器的「新」方法,添加

@package = @event.packages.build 

在你的表格,你將需要使用fields_for方法。在這個整個過程中有一個很好的Railscast:http://railscasts.com/episodes/196-nested-model-form-part-1 如果你不熟悉Ryan Bates的Railscasts,我強烈建議你花點時間和他們在一起。