Search code examples
ruby-on-railsrubynomethoderror

Ruby on Rails - No method error


I'm completing this airbnb clone course (https://code4startup.com/projects/build-airbnb-with-ruby-on-rails-level-1) but have diverted a bit in order to complete my own project; a marketplace for education camps. Therefore I've added an additional model. It now has User>Listing>Course.

Since adding this course I keep receiving the following error upon running the server and going to localhost:3000/courses/new I've tried searching for the problem on stackoverflow but I'm not experienced enough to describe and therefore find the issue, I'd appreciate any ideas.

Error Message

undefined method `curriculum_type' for #<Listing:0x007fb776ac0f50>
Extracted source (around line #15):


            <div class="form-group">
              <label>Course Type</label>
              <%= f.select :curriculum_type, [["English Language", "English Language"], ["Culture", "Culture"], ["Sports", "Sports"], ["Tech/Science", "Tech/Science"], ["Adventure", "Adventure"], ["Mixture", "Mixture"]],
                            id: "type", prompt: "Select...", class: "form-control" %>
            </div>
          </div>

Models

class User < ApplicationRecord
  has_many :listings
  has_many :courses, :through => :listings
end

class Listing < ApplicationRecord
  belongs_to :user
  has_many :courses
end

class Course < ApplicationRecord
  belongs_to :listing
end

Courses Controller

class CoursesController < ApplicationController
before_action :set_course, except: [:index, :new, :create]
before_action :authenticate_user!, except: [:show]

  def index
    @courses = current_user.listings.courses
  end

  def new
    @course = current_user.listings.build
  end

  def create
    @course = listings.build(course_params)
    if @course.save
      redirect_to listing_course_path(@course), notice: "Saved..."
    else
      render :new, notice: "Something went wrong..."
    end
  end

  def show

  def listing
  end

  def pricing
  end

  def description
  end

  def photo_upload
  end

  def amenities
  end

  def location
  end

  def update
    if @course.update(course_params)
      flash[:notice] = "Saved..."
    else
      flash[:notice] = "Something went wrong..."
    end
    redirect_back(fallback_location: request.referer)
  end

  private

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

  def room_params
    params.require(:course).permit(:name, :course_type, :summary, :address, :course_places, :start_date, :finish_date, :price)
  end

end
end

Courses new.html.erb

<div class="panel panel-default">
  <div class="panel-heading">
    Create your course listing
  </div>
  <div class="panel-body">
    <div class="devise-container">

      <%= form_for @course do |f| %>
        <div class="row">
          </div>

          <div class="col_md_4 select">
            <div class="form-group">
              <label>Course Type</label>
              <%= f.select :curriculum_type, [["English Language", "English Language"], ["Culture", "Culture"], ["Sports", "Sports"], ["Tech/Science", "Tech/Science"], ["Adventure", "Adventure"], ["Mixture", "Mixture"]],
                            id: "type", prompt: "Select...", class: "form-control" %>
            </div>
          </div>

          <div class="col_md_4 select">
            <div class="form-group">
              <label>Places</label>
              <%= f.select :course_places, [["1", 1], ["2", 2], ["3", 3], ["4", 4], ["5", 5], ["6", 6], ["7", 7]],
                            id: "places", prompt: "Select...", class: "form-control" %> -->
            </div>
          </div>

        </div>

        <div><%= f.submit "Create My Course", class: "btn btn-primary-green" %></div>
      <% end %>

    </div>
  </div>
</div>

In Rails Console I can create all models, but it seems that it is not recognising the Courses Model when I start the server


Solution

  • Your controller is building a Listing object, but your curriculum_type attribute is an attribute for a Course. You'll want to modify your controller to be building a Course object if that's the case, or add the attribute to Listing.