2

ワークアウト フォーム内のネストされたモデルとしてエクササイズを使用して、ユーザーがワークアウトとエクササイズを記録できるようにするアプリを作成しています。

ルート.rb:

 resources :users do 
    resources :workouts
  end

ワークアウト.rb:

attr_accessible :name, :exercises_attributes
has_many :exercises
belongs_to :user
accepts_nested_attributes_for :exercises, :allow_destroy => true

エクササイズ.rb:

attr_accessible :name, :weight, :reps
belongs_to :workout

私の運動_コントローラー.rbで:

def create
  @workout = @user.workouts.new(workout_params)
  @exercise = @workout.exercises.new(params[:workout][:exercise])

respond_to do |format|
  if @workout.save && @exercise.save
    //...etc

私の運動/_form.html.erbで

<%= form_for [@user, @workout], builder: LabeledFormBuilder do |f| %>

    <%= f.text_field :name %>

        <%= f.fields_for :exercises do |builder| %>
            <%= builder.text_field :name %>
            <%= builder.text_field :weight %>
            <%= builder.text_field :reps %>
        <% end %>

        <%= f.submit %>

<% end %>

ドキュメント ( http://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for ) で規定されているように fields_for を機能させるのに問題があります。

モデルの複数形バージョンが 1 対多の関連にある場合、fields_for に渡すことができるはずです。これは私のworkouts#newアクションでは問題なく機能しますが、私のworkouts#editでは、オブジェクト(ワークアウト)の現在の属性値を表示するために、単一化されたバージョン(:exercise)を渡す必要があります。ドキュメントは言う:

多くの場合、これはモデル オブジェクトの名前だけを fields_for に渡すことで簡略化できます。この場合、:permission がたまたまインスタンス変数 @permission の名前でもある場合、入力フィールドの初期状態は次の値を反映します。その変数の属性 @permission.admin。

:exercises を fields_for に渡すと属性がデータベースに保存されませんが、:exercise を fields_for に渡すとデータベースに保存されますが、編集アクションで現在の属性値は表示されません。

ワークアウト#new および #edit: with fields_for :exercise

<div class="field"><input id="workout_exercise_name" name="workout[exercise][name]" placeholder="name" type="text" /></div>

fields_for :exercises を使用

<div class="field"><input id="workout_exercises_attributes_0_name" name="workout[exercises_attributes][0][name]" placeholder="name" type="text" /></div>

最後に、workout#create の開発者ログに次の内容が記録されています。

Started POST "/users/5/workouts" for 127.0.0.1 at 2013-04-07 14:13:45 -0400
Processing by WorkoutsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"a98ozlUWDtZc49v/PfFds/V0S56R2Y73HsxW6+wjYWI=", "workout"=>{"name"=>"test", "exercise"=>{"name"=>"lunge", "weight"=>"30", "reps"=>"20", "_destroy"=>""}}, "commit"=>"Create Workout", "user_id"=>"5"}
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", "5"]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'dHhQQSEecDOetjh-ZROpmw' LIMIT 1
Unpermitted parameters: exercise
WARNING: Can't mass-assign protected attributes for Exercise: _destroy
    app/controllers/workouts_controller.rb:32:in `create'
   (0.2ms)  BEGIN
  SQL (0.8ms)  INSERT INTO "workouts" ("created_at", "name", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Sun, 07 Apr 2013 18:13:45 UTC +00:00], ["name", "test"], ["updated_at", Sun, 07 Apr 2013 18:13:45 UTC +00:00], ["user_id", 5]]
  SQL (0.6ms)  INSERT INTO "exercises" ("created_at", "name", "reps", "updated_at", "weight", "workout_id") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["created_at", Sun, 07 Apr 2013 18:13:45 UTC +00:00], ["name", "lunge"], ["reps", 20], ["updated_at", Sun, 07 Apr 2013 18:13:45 UTC +00:00], ["weight", 30], ["workout_id", 64]]
   (0.6ms)  COMMIT
   (0.4ms)  BEGIN
   (0.2ms)  COMMIT
Redirected to http://localhost:3000/users/5/workouts
Completed 302 Found in 21ms (ActiveRecord: 3.5ms)

注意許可されていないパラメータ: 演習.

なぜこれが起こっているのか誰にも分かりますか?私はとても困惑しています。どんな助けでも超素晴らしいでしょう。新しいRails 4アプリを作成して、誰もアイデアがない場合は、これらの関連付けをテストするかもしれません.

4

1 に答える 1