BennyB
BennyB

Reputation: 155

No Method Error Undefined method 'save' for nil:NilClass

I'm getting this error when i try to create a "Lecture" via my Lecture controller's create method. This used to work but i went on to work on other parts of the app & then of course i come back & something is now throwing this error when a user tries to create a Lecture in my app.

I'm sure its something small i'm just overlooking (been at it a while & probably need to take a break)...but I'd appreciate if someone could let me know why this is happening...let me know if i need to post anything else...thx!

The error I get

NoMethodError in LecturesController#create

undefined method `save' for nil:NilClass
Rails.root: /Users/name/Sites/rails_projects/app_name

Application Trace | Framework Trace | Full Trace
app/controllers/lectures_controller.rb:13:in `create'

My view to create a new Lecture

views/lectures/new.html.erb

<% provide(:title, 'Start a Lecture') %>

<div class="container">
  <div class="content-wrapper">

    <h1>Create a Lecture</h1>

     <div class="row">
       <div class="span 6 offset3">
         <%= form_for(@lecture) do |f| %>
           <%= render 'shared/error_messages', :object => f.object %>
           <div class="field">
             <%= f.text_field :title, :placeholder => "What will this Lecture be named?" %>
             <%= f.text_area :content, :placeholder => "Describe this Lecture & what will be learned..." %>
           </div>
          <%= f.submit "Create this Lecture", :class => "btn btn-large btn-primary" %>
         <% end %>
       </div>
     </div>
   </div>
 </div>

Then my controller where its saying the error is coming from

controllers/lectures_controller.rb

class LecturesController < ApplicationController
before_filter :signed_in_user, :only => [:create, :destroy]
before_filter :correct_user,   :only => :destroy

def index
end

def new
  @lecture = current_user.lectures.build if signed_in?
end

def create
  if @lecture.save
   flash[:success] = "Lecture created!"
   redirect_to @lecture
  else
   @activity_items = [ ]
   render 'new'
  end
end

def show
 @lecture = Lecture.find(params[:id])
end

def destroy
  @lecture.destroy
  redirect_to root_path
end


private

  def correct_user
    @lecture = current_user.lectures.find_by_id(params[:id])
    redirect_to root_path if @lecture.nil?
  end

Upvotes: 0

Views: 3685

Answers (1)

cdesrosiers
cdesrosiers

Reputation: 8902

You're relying on a before filter to set an instance variable for the subsequent action. This doesn't work. You have to explicitly set it in the controller action that needs it. The sole purpose of before filters is to filter which actions get run and which don't.

EDIT: I misread your code. I thought you were running correct_user before the create action. Either way, glad to know it works now!

Upvotes: 1

Related Questions