我有三个模型:Event
,Workout
和Round
。
一个人可以创建一个包含锻炼的事件,并通过回合配置套数和权重。
我目前正在使用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>
最后,我有Round的形式
<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>
我可以在rails控制台上创建圆形并保存它们。但是当我在网上使用表格时,我无法保存它们。
编辑2
这是我目前event_params
和workout_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 :(得分: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_attributes
中的workout_params
会好起来的。但我也需要在rounds_attributes
中event_params
。
修复它如下修复了问题。
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
答案 1 :(得分:0)
您在事件模型(rounds
)中已经拥有has_many :rounds, :through => :workouts
属性,为什么不使用它?
<% @event.rounds.each do |round|
<%= round.weight %>
<% end %>