私は本当に私を混乱させる問題を抱えています。
Workout モデル、Exercise モデル、workout_exercise 結合モデル、workout_exercise_set モデルの 4 つのモデルがあります。
ワークアウトにエクササイズを追加するには、workout_exercises 結合テーブルを使用します。今、ワークアウトのエクササイズにセットを追加しようとしています。これは、workout_exercises_sets テーブルの目的です。
これが例です。
Workout
Exercise 1
Set 1
Set 2
Set 3
Exercise 2
Set 1
Set 2
Set 3
Exercise 3
etc.
workouts/edit.html.erb
ワークアウトのすべてのエクササイズを表示し、 と を使用してセット数を編集できるフォームがありますがform_for
、エクササイズfields_for
またはワークアウト全体を更新しようとすると、 というメッセージがMassAssignmentSecurity::Error in WorkoutsController#update
表示されますCan't mass-assign protected attributes: workout_exercise_sets
。これを乗り越える方法がわかりません。ワークアウトを編集していることはわかっていますが、 というフィールドに書き込もうとしているわけではないworkout_exercise_sets
ので、ここで本当に混乱しています。ご指導いただきありがとうございます。関連するすべてのコードを以下に示します。
workout/edit.html.erb:
<%= form_for(@workout) do |f| %>
<%= f.label :name %><br />
<%= f.text_field :name %><br />
<%= f.label :description %><br>
<%= f.text_area :description %></br>
<%= f.fields_for :workout_exercises do |s| %>
<%= s.object.exercise.name %></b>
<%= s.fields_for :workout_exercise_sets do |set| %>
<%= set.label :set_number %>:
<%= set.number_field :set_number %>
<%= set.label :reps %>:
<%= set.number_field :repetitions %>
<%= set.label :rest_time %>(seconds):
<%= set.number_field :rest_time %>
<%= set.submit %>
<% end %>
<%= s.hidden_field :_destroy %>
<%= link_to "Remove exercise?", '#', class: "remove_fields" %>
<% end %>
<%= f.submit %>
<% end %>
トレーニングモデルは次のとおりです。
class Workout < ActiveRecord::Base
attr_accessible :name, :exercises_attributes, :workout_exercises_attributes, :exercise_order, :description
has_many :workout_exercises, dependent: :destroy, :order => "exercise_order DESC"
has_many :exercises, through: :workout_exercises
accepts_nested_attributes_for :exercises
accepts_nested_attributes_for :workout_exercises, allow_destroy: :true
end
エクササイズモデルは次のとおりです。
class Exercise < ActiveRecord::Base
attr_accessible :name, :description
has_many :workout_exercises
has_many :workouts, through: :workout_exercises
validates :name, uniqueness: :true, presence: :true
validates :description, uniqueness: :true, presence: :true
end
以下は、workout_exercise モデルです。
class WorkoutExercise < ActiveRecord::Base
attr_accessible :exercise_id, :workout_id
belongs_to :exercise
belongs_to :workout
has_many :workout_exercise_sets, dependent: :destroy
accepts_nested_attributes_for :workout_exercise_sets, allow_destroy: :true
end
最後に、workout_exercise_sets モデルは次のとおりです。
class WorkoutExerciseSet < ActiveRecord::Base
attr_accessible :repetitions, :rest_time, :set_number, :workout_exercise_id
belongs_to :workout_exercise
end
参考までに、DB の図を次に示します。