2010-02-15 15 views
2

Je reçois l'erreur suivante dans mon déploiement Rails 2.3.5 application:Rails: méthode non définie 'to_sym'

NoMethodError (méthode non définie to_sym » pour nulle: NilClass):

Mon test local L'installation de l'application, qui utilise Sqlite, n'obtient pas l'erreur, mais mon application déployée exécutant Mysql le fait. La seule autre différence entre les deux est que je cours Ruby 1.8.7 sur ma machine locale et 1.8.6 sur mon serveur de déploiement.

J'ai inclus le code de User.rb et le journal des erreurs ci-dessous. Je l'ai mis en place à la suite des Railscasts d'autorisation déclarative et d'autorisation intégrée.

Toute aide serait grandement appréciée!

EDIT: Voici le code pour le application_controller, où je mis current_user à l'aide 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 

Le journal des erreurs:

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) 

Répondre

3
def role_symbols 
    [role.to_sym] 
    end 

->role est Nil. Est-ce que vous définissez role quelque part?

+0

Le rôle d'un utilisateur est défini dans le tableau Utilisateurs et attribué à la création de l'utilisateur. La ligne dans le formulaire Nouveaux utilisateurs pour sélectionner un rôle est: <% = f.collection_select: rôle, User :: ROLES,: to_s,: humanize%> –

+0

Ah, c'était tout. Dans ma base de données de test, j'avais déjà défini les rôles, mais pas dans ma base de données de production. Ce qui causait l'erreur. J'ai défini les rôles pour les utilisateurs existants, et tout est bon pour le monde. Merci de m'indiquer dans la bonne direction! –

+0

Il est plus sûr d'ajouter un code de secours retournant un tableau vide si * role * est nul. – nanda

1

A À un certain point, votre code attend un objet de type User, mais obtient nil à la place. Est-ce que vous faites quelque chose comme ça?

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

Où, "Mary" est un utilisateur inexistant? Publiez tous les endroits où vous appelez la méthode role_symbols et nous pouvons vous aider davantage.

Edit: regardant la méthode #roles_for here, sans creuser trop profondément dans ce plugin, je dirais que #current_user n'est pas réglé à ce stade de l'exécution de votre code.

+0

Merci pour la réponse. J'ai ajouté le code pour le contrôleur d'application, où j'ai défini current_user, à la question. –

+0

Oh jeez, j'ai mal lu. JRL est correct - 'role' est nul. Est-ce que vous le placez quelque part? – Ben

1

L'attribut de rôle n'a pas été défini sur la table. Vous devez utiliser un code de secours, et inspecter pourquoi cela se produit.

Teste si la valeur 'rôle' est définie avant l'appel de role.to_sym.