2010-02-15 4 views
2

나는 다음과 같은 오류를 받고 있어요 내 배치 레일 2.3.5 응용 프로그램 (전무에 대한 정의되지 않은 메서드`to_sym 'NilClass) :레일 : 정의되지 않은 방법 'to_sym'

NoMethodError

내 현지 테스트 Sqlite를 사용하는 응용 프로그램을 설치하면 오류가 발생하지 않지만 MySQL을 실행하는 배포 된 응용 프로그램에서는 오류가 발생합니다. 이 둘의 유일한 차이점은 로컬 컴퓨터에서 Ruby 1.8.7을 실행하고 배포 서버에서 1.8.6을 실행하고 있다는 것입니다.

아래에 User.rb의 코드와 오류 로그가 포함되었습니다. 필자는 Declarative Authorization과 Embedded Authorization Railscasts를 따라 이것을 설정했습니다.

도움이 될 것입니다.

편집 : 여기에 내가 before_filter 사용 CURRENT_USER를 설정 application_controller에 대한 코드입니다 :

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 

오류 로그 :

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) 

답변

3
def role_symbols 
    [role.to_sym] 
    end 

->roleNil입니다. role을 어딘가에 정의 하시겠습니까?

+0

사용자 역할은 사용자 테이블에 정의되어 있으며 사용자 작성시 지정됩니다. 역할을 선택하는 새 사용자 양식의 줄은 다음과 같습니다. <% = f.collection_select : role, User :: ROLES, : to_s, : humanize %> –

+0

아, 그랬습니다. 테스트 데이터베이스에는 이미 정의 된 역할이 있지만 프로덕션 데이터베이스에는 그렇지 않습니다. 어떤 오류가 발생했는지. 기존 사용자의 역할을 정의했으며 모든 것이 세계와 맞습니다. 저를 올바른 방향으로 가리켜 주셔서 감사합니다! –

+0

* role *이 nil 인 경우 빈 배열을 반환하는 구조 코드를 추가하는 것이 더 안전합니다. – nanda

1

A 어떤 점에서 코드에 User 유형의 객체가 필요하지만 대신 nil이 발생합니다. 이런 건하고 있니?

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

여기서 "Mary"는 존재하지 않는 사용자 로그인입니까? role_symbols 메소드를 호출하는 곳을 게시하고 더 도움을 줄 수 있습니다.

편집 : 그 플러그인에 너무 깊이 파고하지 않고, here #roles_for 방법을 보면, 그 #current_user이 코드의 실행이 시점에서 설정되어 있지 않습니다 말하고 싶지만.

+0

응답 해 주셔서 감사합니다. 질문에 current_user를 설정 한 응용 프로그램 컨트롤러의 코드를 추가했습니다. –

+0

오, 이런, 내가 잘못 읽었다. JRL은 정확합니다. - 'role'은 무효입니다. 어딘가에두고 있니? – Ben

1

역할 특성이 테이블에 설정되지 않았습니다. 구조 코드를 사용하고 이것이 일어나는 이유를 조사해야합니다.

role.to_sym을 호출하기 전에 'role'값이 설정되었는지 테스트합니다.

관련 문제