0

私は本当に私を混乱させる問題を抱えています。

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 の図を次に示します。ここに画像の説明を入力

4

1 に答える 1

1

あなたのworkout_excercise.rbファイルで、リストに追加:workout_exercise_sets_attributesする必要があると思いますattr_accessible

class WorkoutExercise < ActiveRecord::Base
  attr_accessible :exercise_id, :workout_id, :workout_exercise_sets_attributes

  belongs_to :exercise
  belongs_to :workout

  has_many :workout_exercise_sets, dependent: :destroy 
  accepts_nested_attributes_for :workout_exercise_sets, allow_destroy: :true

end
于 2013-08-12T22:45:32.007 に答える