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 오류를 방지하는 로직을 추가해야합니다 추가 할 수 있습니다.