views:

41

answers:

1

I've been upgrading my app from Rails 2.3.8 to Rails 3.

After getting all the basic stuff done (configs, routes, and the new AR API, replacing Authlogic with Devise) and getting some mostly static pages to show up fine I get an error in the rest of my site:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.any?

This error always appears when I reference SomeModel for the first time. E.g., in my news#index:

@news_story = NewsStory.new # gets called from before_filter

The full stack trace is below. The trace seems to indicate that the model in my app/models/news_story.rb does not get loaded.

I've been struggling with this the whole day. Does anyone have an idea of what is going on?

# stack trace:
activesupport (3.0.0) lib/active_support/dependencies.rb:497:in `load_missing_constant'
activesupport (3.0.0) lib/active_support/dependencies.rb:183:in `block in const_missing'
activesupport (3.0.0) lib/active_support/dependencies.rb:181:in `each'
activesupport (3.0.0) lib/active_support/dependencies.rb:181:in `const_missing'
app/controllers/news_controller.rb:82:in `new_post'
activesupport (3.0.0) lib/active_support/callbacks.rb:451:in `_run__810448074__process_action__85542351__callbacks'
activesupport (3.0.0) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
activesupport (3.0.0) lib/active_support/callbacks.rb:93:in `run_callbacks'
actionpack (3.0.0) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (3.0.0) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
...

Controller action:

class NewsController < ApplicationController
  before_filter :new_post_from_params, :only => :create
  before_filter :new_post, :only => [:index, :new]
  before_filter :find_post, :except => [:index, :create, :new]
  filter_access_to :all, :attribute_check => true

  def index
    @user = current_user
    @news = NewsStory.all
    respond_to do |format|
      format.html # index.html.erb
      format.xml { render :xml => @user.news }
    end
  end
  #...
  private

  def new_post_from_params
    @news_story = NewsStory.new(params[:news_story])
  end

  def new_post
    @news_story = NewsStory.new
  end

  def find_post
    @news_story = NewsStory.find(params[:id])
  end
end

Additional info:

  • app/models/news_story.rb
  • Gemfile
  • config/application.rb

  • Ruby version:

    ~ $ ruby -v
    ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
    
  • Creating news story from console:

    irb(main):001:0> NewsStory.new
    => #<NewsStory id: nil, title: nil, body: nil, user_id: nil, created_at: nil, updated_at: nil>
    
A: 

So, the problem was that some parent_* methods I defined in my application controller had a name collision with the new ActionController methods, which did not happen in Rails 3.

Took me forever to figure out, dammit

glebm