0

だけ が は通じ多く持っているか持っていますし、多くの行方不明のIDに属し

モデル「をワークアウトのIDが存在しなければならない」重み

を私がしようとすると、私はこのエラーを取得していますここでは、簡単なワークアウトのログを作成し、作成しよう

class Workout < ApplicationRecord 
belongs_to :user 
has_many :exercises 
has_many :weights, through: :exercises 
accepts_nested_attributes_for :exercises, :allow_destroy => true 
accepts_nested_attributes_for :weights, :allow_destroy => true 
validates :bodypart, presence: true, length: { maximum: 255 } 
end 

class Weight < ApplicationRecord 
    belongs_to :exercise 
    belongs_to :workout 
    validates :amount, presence: true, length: { maximum: 255 } 
    validates :reps, presence: true, length: { maximum: 255 } 
end 

class Exercise < ApplicationRecord 
    belongs_to :workout 
    has_many :weights 
    accepts_nested_attributes_for :weights 
    validates :name, presence: true 
    validates_associated :weights 
end 

私はいくつかのことを読んだ後に、多くのスルーがあることがこれらの関連付けのオプションになると思ったが、今はそれほど確かではない。私がエクササイズのために体重を試してみると、エクササイズIDが得られますが、何回も試してもエクササイズIDを得ることはできません。私は単純にコントローラの問題か、もし私がここでもっと大きなものを見逃しているのかどうかは分かりません。

私の現在の重みコントローラ

class WeightsController < ApplicationController 
before_action :authenticate_user! 

def new 
@weight = Weight.new 
end 

def create 
    @exercise = Exercise.find(params[:exercise_id]) 
    @weight = @exercise.weights.build(weight_params) 
if @weight.save 
    flash[:notice] = "Set saved" 
    redirect_to exercise_path(@exercise) 
else 
    redirect_to exercise_path(@exercise) 
    flash[:notice] = "#{@weight.errors.full_messages.to_sentence}" 
end 
end 

def edit 
end 

def update 
end 

def destroy 
weight = Weight.find(params[:id]) 
@weight.destroy 
redirect_to root_path 
end 

private 

def weight_params 
params.require(:weight).permit(:amount, :reps) 
end 

end 

routes.rbを

Rails.application.routes.draw do 

devise_for :users, controllers: { omniauth_callbacks: "callbacks" } 
root 'articles#index' 

get '/demo', to: 'static_pages#demo' 
get '/about', to: 'static_pages#about' 
get '/test', to: 'static_pages#index' 

resources :articles 

resources :workouts do 
    resources :exercises 
end 

resources :exercises do 
    resources :weights 
end 

resources :workouts do 
    member do 
     put :is_finished 
     put :unfinish 
    end 
end 

resources :exercises do 
    member do 
     put :is_finished 
     put :unfinish 
    end 
end 

resources :books, :only => :index 
end 

演習コントローラ私はいつも私のウェイトモデルが、それに設定workout_idためのID列を持っている

class ExercisesController < ApplicationController 
before_action :authenticate_user! 
# before_action :set_exercise, except: [:index, :new, :create] 

def new 
@exercise = Exercise.new 
@exercise.weights.new 
end 

def index 
@workout = Workout.find(params[:workout_id]) 
@exercise = @workout.exercises 
end 

def create 
@workout = Workout.find(params[:workout_id]) 
@exercise = @workout.exercises.build(exercise_params) 
    if @exercise.save 
    redirect_to workout_exercise_path(@workout, @exercise) 
    flash[:notice] = "Exercise created, enter weight and reps for  your first set" 
    else 
    redirect_to @workout 
    flash[:notice] = "#{@exercise.errors.full_messages.to_sentence}" 
    end 
end 

def edit 
end 

def update 
@exercise = Exercise.find(params[:id]) 
if @exercise.update_attributes(exercise_params) 
    redirect_to exercise_path(@exercise) 
else 
    flash[:notice] = "Something went wrong" 
end 
end 

def show 
@exercise = Exercise.find(params[:id]) 
@weights = @exercise.weights.order('created_at DESC').paginate(page:  params[:page], per_page: 5) 
end 

私が演習を作成することができるときはいつでもNULLを設定します。また、レールコンソールでは、私はワークアウトを見つけて@workout.weightsを呼び出すことができ、それはちょうど良いトレーニングに関連付けられているウェイトを返します。体重モデルに取り込むトレーニングIDを取得できません。多くの人が持っていると思っていることを思い出してください。私は運が無ければ "inverse_of"を試しました。どんな助けもありがとう。

答えて

0

答えは簡単です。逆の機能を追加するには、エクササイズを通じて明示的に状態を記述する必要があります。

weight.rbbelongs_to :workoutを削除し、以下の

def workout 
    self.exercise.workout 
end 

はおそらく、あなたがnilClassエラーを回避するためのロジックを追加する必要があります追加します。

今度は@weight.workoutから@weight.exercise

関連する問題