jeudi 12 octobre 2017

NoMethodError in ParticipantsController#new

Why does the error occur?

There hasen't been an adquate/similar solution for my problem. I just could find some tips and tricks here but now I am stuck.

We have a course management system. You can add new coures, participants and persons among other things. I had to change the database. Now there is a persons table, too. Earlier all informations about persons respectively participants where just saved in the participants table. Now when a new participant is added the persons table is involved. We want to add a new participant of a course. I adjusted the new action in the participants controller and I was hoping passing all data like in the old way. The old way was working to add a new participant.

Earlier the way was: course > new participant form

Now it is: course > search for a person to use it in the form > new participant form

I think (better ways accepted) I just adjust the old code?! Below is my try.

The Error

NoMethodError in ParticipantsController#new undefined method `participants' for []:Array

occurs.

Here are the old classes:

Model Course

class Course < ActiveRecord::Base
  has_many :participants

Model Participant

class Participant < ActiveRecord::Base
  belongs_to :course
  belongs_to :organization
  belongs_to :function

ParticipantsController

class ParticipantsController < ApplicationController

....
 def new
    @course = Course.find(params[:course_id])
    @participant = @course.participants.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @participant }
    end
  end

 def create
    @course = Course.find(params[:course_id])
    @participant = @course.participants.new(params[:participant])
    @course.updated_by = current_user.cn
    @course.send(:create_version)
    @course.tag_version(t(:participant_added))
    @course.save!

    respond_to do |format|
      if @participant.save
        format.html { redirect_to course_path(@participant.course), notice: 'Participant was successfully created.' }
        format.json { render json: @participant, status: :created, location: @participant }
      else
        format.html { render action: "new" }
        format.json { render json: @participant.errors, status:     :unprocessable_entity }
      end
    end
  end

When you look below at the course view snippet there is the old and new path to the form. Note that the person search is in between the course and the new participant form now.

**old**    <%= link_to t(:add), new_course_participant_path(@course) %>

**new**    <%= link_to t(:add), course_persons_path(@course, @person)%>

Here are the new classes

class Participant < ActiveRecord::Base
  belongs_to :course
  belongs_to :function
  belongs_to :person

class Person < ActiveRecord::Base
  has_many :participants
  has_many :courses, through:  :participants

Here are my adjustments in the ParticipantsController. My thoughts are maybe naive because I am still learning ruby on rails.

class ParticipantsController < ApplicationController
    def new
       @person = Person.find(params[:person_id])
       @participant = Participant.find_by_person_id(params[:person_id])
       @course= Course.find(:all, :conditions => {:id => @participant})
       @participant = @course.participants.build

 def create 
    @course= Course.find(params[:course_id])
    @participant = @course.participants.new(params[:participant])
    @course.updated_by = current_user.cn
    @course.send(:create_version)
    @course.tag_version(t(:participant_added))
    @course.save!

    respond_to do |format|
      if @participant.save
        format.html { redirect_to course_path(@participant.course), notice:     'Participant was successfully created.' }
        format.json { render json: @participant, status: :created, location: @participant }

      else
        format.html { render action: "new" }
        format.json { render json: @participant.errors, status: :unprocessable_entity }
      end
    end
  end

Thanks in advance

Aucun commentaire:

Enregistrer un commentaire