Skip to content

Error de validación: "Course can't be blank" #1

@ncuesta

Description

@ncuesta

En las siguientes líneas:

@evaluation = Evaluation.new

@evaluation = Evaluation.new(evaluation_params)

@evaluation = Evaluation.find(params[:id])

estás creando una Evaluation sin indicar que pertenece al Course que tenés disponible en @course.

Cuando se trabaja con controllers anidados, como este caso, te conviene utilizar la asociación del recurso "padre" (Course) en este caso, para acceder a los recursos anidados (Evaluation, en este caso). De esta forma, todas las consultas a la base y todos los modelos de las evaluaciones van a estar siempre restringidos al curso indicado. De hecho, como lo tenés ahora, podrías acceder a una evaluación de otro curso al que indiques por el :course_id de la URL.

A lo que me refiero es a que hagas algo así:

class EvaluationsController < ApplicationController
  before_action :set_course
  before_action :set_evaluation, only: [:show, :edit, :update, :destroy]
  # GET /evaluations
  # GET /evaluations.json
  def index
    @evaluations = @course.evaluations
  end

  # GET /evaluations/1
  # GET /evaluations/1.json
  def show
  end

  # GET /evaluations/new
  def new
    @evaluation =@course.evaluations.new
  end

  # GET /evaluations/1/edit
  def edit
  end

  # POST /evaluations
  # POST /evaluations.json
  def create
    @evaluation = @course.evaluations.new(evaluation_params)

    respond_to do |format|
      if @evaluation.save
        format.html { redirect_to course_evaluations_path(@course), notice: 'Evaluation was successfully created.' }
        format.json { render :show, status: :created, location: @evaluation }
      else
        format.html { render :new }
        format.json { render json: @evaluation.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /evaluations/1
  # PATCH/PUT /evaluations/1.json
  def update
    respond_to do |format|
      if @evaluation.update(evaluation_params)
        format.html { redirect_to course_evaluations_path(@course), notice: 'Evaluation was successfully updated.' }
        format.json { render :show, status: :ok, location: @evaluation }
      else
        format.html { render :edit }
        format.json { render json: @evaluation.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /evaluations/1
  # DELETE /evaluations/1.json
  def destroy
    @evaluation.destroy
    respond_to do |format|
      format.html { redirect_to course_evaluations_path(@course), notice: 'Evaluation was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_evaluation
      @evaluation = @course.evaluations.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def evaluation_params
      params.require(:evaluation).permit(:title, :minNote, :date, :course_id)
    end

    def set_course
      @course = Course.find(params[:course_id])
    end
end

Update: cambié el orden de los before_action

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions