Reputation: 155
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
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