2016-06-03 5 views
0

У меня есть набор вложенных маршрутов, которые выглядят следующим образом:Не удалось найти тренировки без ID ошибки с вложенными Маршруты

resources :workouts do 
    resources :exercises do 
     resources :reports, shallow: true 
    end 
    end 

Я пытался сделать их неглубоко, насколько это возможно, но не гнездятся их просто генерироваться слишком много ошибок.

В настоящий момент они работают нормально, за исключением случаев, когда я пытаюсь получить доступ к странице exercises#index для конкретной тренировки. Я связывающая страницу, как это:

<%= link_to 'Add/Edit Exercises', workout_exercises_path(@workout, exercise), method: :index %> 

И когда я нажимаю на эту ссылку я получаю:

ActiveRecord::RecordNotFound at /workouts/3/exercises 
Couldn't find Workout without an ID 

Ошибка вызывается на моем exercises_controller на указанной линии:

class ExercisesController < ApplicationController 
    before_action :authenticate_user! 

    def index 
     @workout = Workout.friendly.find(params[:id]) <<<<<THIS LINE 
     @exercise = Exercise.new 
     @exercises = Exercise.all 
    end 

    def new 
    @exercise = Exercise.new 
    end 

    def create 
    @workout = Workout.friendly.find(params[:id]) 
    exercise = @workout.exercises.new(exercise_params) 
    exercise.user = current_user 

    if exercise.save 
     flash[:notice] = "Results saved successfully." 
     redirect_to [@workout] 
    else 
     flash[:alert] = "Results failed to save." 
     redirect_to [@workout] 
    end 
    end 

    def destroy 
    @workout = Workout.friendly.find(params[:workout_id]) 
    exercise = @workout.exercises.find(params[:id]) 

    if exercise.destroy 
     flash[:notice] = "Exercise was deleted successfully." 
     redirect_to [@workout] 
    else 
     flash[:alert] = "Exercise couldn't be deleted. Try again." 
     redirect_to [@workout] 
    end 
    end 

    private 

    def exercise_params 
     params.require(:exercise).permit(:name, :needs_seconds, :needs_weight, :needs_reps, :workout_id) 
    end 

    def authorize_user 
    exercise = Exercise.find(params[:id]) 
    unless current_user == current_user.admin? 
     flash[:alert] = "You do not have permission to create or delete an exercise." 
     redirect_to [exercise.workout] 
    end 
    end 
end 

friendly.find - это потому, что я использую драгоценный камень friendly_id, который генерирует пули вместо идентификаторов в URL-адресе. Я использую его таким же образом в других рабочих моделях, поэтому я не считаю, что это вызывает текущую проблему.

Может ли кто-нибудь понять, почему я получаю эту ошибку? Я набрал @workout в живую оболочку моей ошибки, и она говорит, что @workout - nil, что означает, что она каким-то образом не получает значение. Я знаю, что это важная информация, но не знаю, как ее исправить.

ответ

0

Проблема заключается в том:

  • Ваш маршрут был /workouts/3/exercises, поэтому формат, как: /workouts/:workout_id/exercises

  • Так просто изменить ваш метод create немного:

    def create 
        @workout = Workout.friendly.find(params[:workout_id]) 
        exercise = @workout.exercises.build(exercise_params) 
        ... 
    end 
    
+0

Это я думаю, получил через первоначальную ошибку, но теперь у него есть проблема с моим Params: 'пары отсутствуют или значение пусто: exercise' – Liz

+0

И мне придется изменить корреляционный раздел моего' уничтожить 'метод также? – Liz

+0

Добавить точку отладки в этом методе 'exercise_params' и посмотреть, какой параметр отсутствует! –

0
def index 
     @workout = Workout.friendly.find(params[:workout_id]) 
     @exercise = Exercise.new 
     @exercises = Exercise.all 
    end 

Попробуйте это, надеюсь, это вам поможет.

+0

К сожалению, даже с этим изменением я все равно получаю 'param отсутствует, или значение пустое: упражнение 'вызывало параметры моего' exercise_controller'. – Liz