1

我有三種型號:Event,WorkoutRound如何以雙重嵌套形式保存表單?

一個人可以創建一個事件,其中包括鍛鍊,並通過輪配置數量和權重。

我正在使用cocoon gem創建一個嵌套窗體。我能夠使用表格並保存事件和鍛鍊,但是,Round不會被保存。

class Event < ActiveRecord::Base 
    has_many :workouts, dependent: :destroy 
    has_many :rounds, :through => :workouts 
    belongs_to :user 
    accepts_nested_attributes_for :workouts, :allow_destroy => true 
end 

class Workout < ActiveRecord::Base 
    belongs_to :event 
    has_many :rounds, dependent: :destroy 
    accepts_nested_attributes_for :rounds, :allow_destroy => true 
end 

class Round < ActiveRecord::Base 
    belongs_to :workout 
    belongs_to :event 
end 

我目前有我的路線設置爲這樣。

Rails.application.routes.draw do 
    devise_for :users 
    root 'static_pages#index' 
    resources :events do 
    resources :workouts do 
     resources :rounds 
     end 
    end 

在我的控制器中,這是我如何有我的新方法。

New Method for Event 
    def new 
    @event = current_user.events.new 
    end 

    New Method for Workout 
    def new 
    @workout = Workout.new 
    end 

    New Method for Round 
    def new 
    @round = Round.new 
    end 

我目前在事件'視圖文件夾下的窗體。在活動的show.html.erb查看文件,我想通過

<% @workout.rounds.each do |round| %> 
    <%= round.weight %> 
<% end %> 

顯示大紅大紫很好,但我得到undefined method for rounds。是不是可以在事件視圖中顯示?

感謝您的幫助!


編輯1

這是我的嵌套形式。 頂部,我有事件的形式。

<%= simple_form_for @event do |f| %> 
    <%= f.input :title %> 

     <h3>Work Outs</h3> 
     <div id="workouts"> 
     <%= f.simple_fields_for :workouts do |workout| %> 
      <%= render 'workout_fields', f: workout %> 
     <% end %> 
     <div class="links"> 
      <%= link_to_add_association 'add workout', f, :workouts %> 
     </div> 
     </div> 

     <div class="field"> 
     <%= f.label :start_time %><br> 
     <%= f.datetime_select :start_time %> 
     </div> 
     <div class="field"> 
     <%= f.label :end_time %><br> 
     <%= f.datetime_select :end_time %> 
     </div> 
     <div class="field"> 
     <%= f.label :description %><br> 
     <%= f.text_area :description %> 
     </div> 
     <div class="actions"> 
     <%= f.submit "Create new Workout" %> 
     </div> 
    <% end %> 
<% end %> 

</form> 

再有就是爲鍛鍊

<div class="nested-fields"> 
    <%= f.input :name %> 

    <div class="rounds"> 
    <%= f.simple_fields_for :rounds, :wrapper => 'inline' do |round| %> 
     <%= render 'round_fields', f: round %> 
    <% end %> 
    <div class="links"> 
     <%= link_to_add_association 'add round', f, :rounds, :render_option => { :wrapper => 'inline' } %> 
    </div> 
    </div> 
    <%= link_to_remove_association "remove workout", f %> 
</div> 

一種形式,最後,我有形式

回合
<div class="nested-fields"> 

    <table class="table round-table"> 
    <tr> 
     <td> 
     <% index = 0 %> 
     <%= f.simple_fields_for :rounds do |round| %> 
      <%= render 'set_fields', {f: round, index: index} %> 
      <% index = index + 1 %> 
     <% end %> 
     </td> 
     <td>Previous Weight</td> 
     <td><%= f.input_field :weight %></td> 
     <td><%= f.input_field :repetition %></td> 
     <td><%= link_to_remove_association "remove rounds", f %></td> 
    </tr> 
    </table> 
</div> 

我能夠軌控制檯上創建圓形和保存。但是當我在網上使用這個表格時,我無法保存它們。


EDIT 2

這是目前我如何有event_paramsworkout_params設置。

def event_params 
    params.fetch(:event, {}).permit(:title, :description, :start_time, :end_time, :workouts_attributes => [:id, :name, :category, :_destroy]) 
end 

然後workout_params

def workout_params 
    params.require(:workout).permit(:name, :category, :rounds_attributes => [:id, :weight, :set, :repetition, :_destroy]) 
end 

我很困惑,爲什麼形式將節省事件和鍛鍊。但是Round總是返回一個空數組。

+0

您是否在您的'EventsController#show'動作中設置了@workout? – user3680688

+0

我認爲這不是必須的,因爲has_many associations.Should我鍛鍊event.workouts? –

回答

0

您已在事件模型(has_many :rounds, :through => :workouts)中擁有rounds屬性,爲什麼不使用它?

<% @event.rounds.each do |round| 
    <%= round.weight %> 
<% end %> 
+0

我沒有意識到我可以直接從@event訪問。謝謝。 但似乎沒有我的回合被保存,因爲沒有數字正在顯示從回合.. –

1

終於解決了!

我不得不在params也有一個協會。雙嵌套關聯。

def event_params 
    params.fetch(:event, {}).permit(:title, :description, :start_time, :end_time, :workouts_attributes => [:id, :name, :category, :_destroy]) 
end 

對於我event_params,我只有:workouts_attributes。我認爲有:rounds_attributesworkout_params會沒事的。但我需要在event_params也有rounds_attributes

修復它像下面的問題解決了這個問題。

def event_params 
    params.fetch(:event, {}).permit(:title, :description, :start_time, :end_time, :workouts_attributes => [:id, :name, :category, :_destroy, :rounds_attributes => [:id, :weight, :set, :repetition, :_destroy]]) 
end 
+0

你應該標記這個答案是正確的;) – danilopopeye