Mike Stamb Mike Stamb - 3 months ago 12
Ruby Question

Routing Error uninitialized constant SubmitsController (Trying to upload document using Carrierwave)

I am building my first useful Rails application for a teacher to post assignments and students to upload their work (jpeg|pdf) on the website using Carrierwave.

Tutorial I want to replicate: http://www.tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm

Error: "`undefined method submits_path' for #<#:0x007f7260dbc7a0> Did you mean? submit_path"

Error message: Extracted source (around line #14):

13 <div class = "well">
14 <%= form_for @submits, html: { multipart: true } do |f| %>
15 <%= f.label :name %>
16 <%= f.text_field :name %>
17 <%= f.label :attachment %>


model: submit.rb

class Submit < ActiveRecord::Base
mount_uploader :attachment, AttachmentUploader # Tells rails to use this uploader for this model.
validates :name, presence: true # Make sure the owner's name is present.
end


controller: submit_controller.rb

class SubmitController < ApplicationController
def index
@submits = Submit.all
end

def new
@submit = Submit.new
end

def create
@submit = Submit.new(submit_params)

if @submit.save
redirect_to submits_path, notice: "The assignment #{@submit.name} has been uploaded."
else
render "new"
end

end

def destroy
@submit = Submit.find(params[:id])
@submit.destroy
redirect_to submits_path, notice: "The assignment #{@submit.name} has been deleted."
end

private
def submit_params
params.require(:submit).permit(:name, :attachment)
end

end


routes:

Rails.application.routes.draw do

resources :submit, only: [:index, :new, :create, :destroy]

get 'welcome/index'

get 'welcome/about'

root 'welcome#index'
end


schema:

ActiveRecord::Schema.define(version: 20160903040246) do

create_table "submits", force: :cascade do |t|
t.string "name"
t.string "attachment"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

end


rake routes
:

Prefix Verb URI Pattern Controller#Action
submit_index GET /submit(.:format) submit#index
POST /submit(.:format) submit#create
new_submit GET /submit/new(.:format) submit#new
submit DELETE /submit/:id(.:format) submit#destroy
welcome_index GET /welcome/index(.:format) welcome#index
welcome_about GET /welcome/about(.:format) welcome#about
root GET / welcome#index


Thanks in advance to all the wonderful people here who are willing to lend a helping hand

Answer

You're using @submits insted of @submit, here:

<%= form_for @submits, html: { multipart: true } do |f| %>

Shoul be:

<%= form_for @submit, html: { multipart: true } do |f| %>

Which is the variable you have created in the controller, here:

def new
  @submit = Submit.new
end

EDITED ANSWER

I'm gonna take a step back here and point some problems you're facing due to Rails Convention.

The Rails philosophy is Convention Over Configuration. That means that if you follow some conventions, Rails will be able to do what you expect it to do it without configuring anything (or almost anything).

Besides the error I pointed above, all the other errors you have listed in the answers are because you created your controller in the singular SubmitController instead of SubmitsController. This changes the convention expected by Rails, so you would have to some configurations by hand.

Since you're following a tutorial or something, my advice is to take a step back and re-create your controller with the right conventions.