【问题标题】:Rails: Undefined method 'to_sym'Rails:未定义的方法'to_sym'
【发布时间】:2011-01-17 01:15:39
【问题描述】:

我在部署的 Rails 2.3.5 应用程序中遇到以下错误:

NoMethodError(nil:NilClass 的未定义方法 `to_sym'):

我使用 Sqlite 的应用程序的本地测试安装没有出现错误,但我部署的运行 Mysql 的应用程序会出现错误。两者之间唯一的其他区别是我在本地计算机上运行 Ruby 1.8.7,在部署服务器上运行 1.8.6。

我已包含来自User.rb 的代码和下面的错误日志。我按照声明式授权和嵌入式授权 Railscast 进行设置。


编辑:这是application_controller 的代码,我使用before_filter 设置current_user

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

--

用户.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)

【问题讨论】:

    标签: ruby-on-rails ruby roles declarative-authorization


    【解决方案1】:

    角色属性尚未在表上设置。您必须使用救援代码,并检查发生这种情况的原因。

    测试是否在调用 role.to_sym 之前设置了“角色”值。

    【讨论】:

      【解决方案2】:
        def role_symbols
          [role.to_sym]
        end
      

      -> roleNil。你在某个地方定义了role 吗?

      【讨论】:

      • 用户的角色在用户表中定义,并在用户创建时分配。新用户表单中用于选择角色的行是:
      • 啊,就是这样。在我的测试数据库中,我已经定义了角色,但在我的生产数据库中,我没有。这是导致错误的原因。我为现有用户定义了角色,一切都很好。感谢您为我指明正确的方向!
      • 如果 role 为 nil,则添加返回空数组的救援代码会更安全。
      【解决方案3】:

      在某些时候,您的代码需要一个 User 类型的对象,但却得到了 nil。你在做这样的事吗?

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

      哪里,“玛丽”是一个不存在的用户登录?发布您调用 role_symbols 方法的任何地方,我们可以提供更多帮助。

      编辑:查看方法#roles_for here,无需深入研究该插件,我会说在您的代码执行时没有设置#current_user。 p>

      【讨论】:

      • 感谢您的回复。我在问题中添加了应用程序控制器的代码,我在其中设置了 current_user。
      • 天哪,我看错了。 JRL 是正确的——role 为零。你是在什么地方设置的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2017-01-11
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多