2016-06-03 14 views
0

ich eine Reihe von verschachtelten Routen haben, die wie folgt aussehen:konnte nicht Workout ohne ID-Fehler mit Nested Routen finden

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

ich versuchte, sie so flach wie möglich zu machen, aber nicht nisten sie einfach erzeugt zu viele Fehler.

Im Moment funktionieren sie gut, außer wenn ich versuche, auf die exercises#index Seite für ein bestimmtes Training zuzugreifen. Ich Verknüpfung der Seite wie folgt aus:

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

Und wenn ich auf diesen Link klicken, erhalte ich:

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 
:

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

Der Fehler auf meinem exercises_controller in der angegebenen Leitung aufgerufen

Die friendly.find ist, weil ich den friendly_id Edelstein verwende, der Schnecken anstelle von Ids in der URL erzeugt. Ich benutze es auf die gleiche Weise in anderen Arbeitsmodellen, daher glaube ich nicht, dass dies das aktuelle Problem verursacht.

Kann jemand sehen, warum ich diesen Fehler bekomme? Ich habe @workout in die Live-Shell meines Fehlers eingegeben und es heißt, dass @workoutnil ist, was bedeutet, dass es den Wert irgendwie nicht bekommt. Ich weiß, dass dies wichtige Informationen sind, aber ich weiß nicht, wie ich es beheben kann.

Antwort

0

Das Problem ist:

  • Ihr Weg war /workouts/3/exercises, so dass es formatiert werden wie: /workouts/:workout_id/exercises

  • So einfach Ihre create Methode ein wenig ändern:

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

Dies Ich denke, durch die ursprüngliche Fehlermeldung anzeigt, aber jetzt hat es ein Problem mit meinem params: 'param fehlt oder der Wert leer ist: exercise' – Liz

+0

Und ich habe den Korrelat Abschnitt meines' zerstören ändern 'Methode auch? – Liz

+0

Fügen Sie einen Debug Breakpoint in diese Methode 'exercise_params' hinzu und sehen Sie, welcher Parameter fehlt! –

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

Versuchen Sie diese, hoffe, das würde Ihnen helfen.

+0

Leider bekomme ich auch bei dieser Änderung immer noch 'Param fehlt oder der Wert ist leer: Übung' ruft die Parameter meines 'Übungskontrollers' auf. – Liz