views:

1000

answers:

3

I'm getting the following error in my deployed Rails 2.3.5 application:

NoMethodError (undefined method `to_sym' for nil:NilClass):

My local testing install of the application, which uses Sqlite, doesn't get the error, but my deployed app running Mysql does. The only other difference between the two is I'm running Ruby 1.8.7 on my local machine and 1.8.6 on my deployment server.

I've included the code from User.rb and the error log below. I set this up following the Declarative Authorization and Embedded Authorization Railscasts.

Any help would be greatly appreciated!

EDIT: Here's the code for the application_controller, where I set current_user using before_filter:

class ApplicationController < ActionController::Base
  helper :all
  helper_method :current_user_session, :current_user 
  before_filter :set_current_user

  protected 

  def set_current_user
    Authorization.current_user = current_user
  end

  def current_user_session  
    return @current_user_session if defined?(@current_user_session)  
    @current_user_session = UserSession.find  
  end  

  def current_user  
    @current_user = current_user_session && current_user_session.record  
  end
end

--

User.rb:

class User < ActiveRecord::Base
  acts_as_authentic 

  has_many :products
  has_many :transactions

  ROLES = %w[admin dmstaff staff faculty]

  def role_symbols
    [role.to_sym]
  end  

end

The error log:

NoMethodError (undefined method `to_sym' for nil:NilClass):
  app/models/user.rb:10:in `role_symbols'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization 0.4/lib/declarative_authorization/authorization.rb:242:in `roles_for'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/authorization.rb:296:in  `user_roles_privleges_from_options'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/authorization.rb:161:in `permit!'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/in_controller.rb:580:in `permit!'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/in_controller.rb:109:in `filter_access_filter'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/in_controller.rb:109:in `each'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/in_controller.rb:109:in `all?'
  /usr/lib/ruby/gems/1.8/gems/declarative_authorization-0.4/lib/declarative_authorization/in_controller.rb:109:in `filter_access_filter'
  passenger (2.2.5) lib/phusion_passenger/rack/request_handler.rb:95:in `process_request'
  passenger (2.2.5) lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
  passenger (2.2.5) lib/phusion_passenger/railz/application_spawner.rb:378:in `start_request_handler'
  passenger (2.2.5) lib/phusion_passenger/railz/application_spawner.rb:336:in `handle_spawn_application'
  passenger (2.2.5) lib/phusion_passenger/utils.rb:183:in `safe_fork'
  passenger (2.2.5) lib/phusion_passenger/railz/application_spawner.rb:334:in `handle_spawn_application'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:163:in `start'
  passenger (2.2.5) lib/phusion_passenger/railz/application_spawner.rb:213:in `start'
  passenger (2.2.5) lib/phusion_passenger/spawn_manager.rb:262:in `spawn_rails_application'
  passenger (2.2.5) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
  passenger (2.2.5) lib/phusion_passenger/spawn_manager.rb:256:in `spawn_rails_application'
  passenger (2.2.5) lib/phusion_passenger/abstract_server_collection.rb:80:in `synchronize'
  passenger (2.2.5) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
  passenger (2.2.5) lib/phusion_passenger/spawn_manager.rb:255:in `spawn_rails_application'
  passenger (2.2.5) lib/phusion_passenger/spawn_manager.rb:154:in `spawn_application'
  passenger (2.2.5) lib/phusion_passenger/spawn_manager.rb:287:in `handle_spawn_application'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
  passenger (2.2.5) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'

Rendering /var/data/app/current/public/500.html (500 Internal Server Error)
+1  A: 

At some point, your code is expecting an object of type User, but is getting nil instead. Are you doing anything like this?

@user = User.find_by_login("Mary")
@user.role_symbols

Where, "Mary" is a nonexistent user login? Post any places where you are calling the role_symbols method and we can help more.

Edit: Looking at the method #roles_for here, without digging too deeply into that plugin, I'd say that #current_user is not set at this point of your code execution.

Ben
Thanks for the response. I added the code for the application controller, where I set current_user, to the question.
Eric K
Oh jeez, I misread. JRL is correct--`role` is nil. Are you setting it somewhere?
Ben
+1  A: 
  def role_symbols
    [role.to_sym]
  end

-> role is Nil. Do you define role somewhere?

JRL
A user's role is defined in the Users table, and is assigned at the user's creation. The line in the New Users form for selecting a role is: <%= f.collection_select :role, User::ROLES, :to_s, :humanize %>
Eric K
Ah, that was it. In my test database, I already had the roles defined, but in my production database, I didn't. Which was causing the error. I defined the roles for the existing users, and all is right with the world. Thanks for pointing me in the right direction!
Eric K
It's safer to add a rescue code returning an empty array if *role* is nil.
nanda
A: 

Role attribute hasn't been set on the table. You have to use a rescue code, and inspect why this happens.

Test if 'role' value is setted before call role.to_sym.

nanda