【问题标题】:call instance method with class instance variable - ruby on rails使用类实例变量调用实例方法 - ruby​​ on rails
【发布时间】:2016-10-02 08:21:37
【问题描述】:

我正在尝试从控制器中的实例变量调用实例方法(在模型中定义),但无法完成该工作,服务器日志显示

# 的未定义方法 `active_users'

控制器

@admin = Admin.first
@admin.active_users

管理模式

def self.active_users
  byebug
end

我知道我们可以像Admin.active_users这样直接通过类调用。

为什么类的实例不能访问它?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    active_users 方法是为 Admin 对象定义的,而不是为其实例定义的。

    我不知道你想做什么,但消息接收者很重要。

    要使@admin.active_users 工作,将方法定义为实例方法:

    def active_users
      byebug
    end
    

    问题是,active_users(有和没有self)是实例方法。只是这些方法定义的对象不同而已。

    带有self的方法是“类实例方法”,而没有self的方法是“实例方法”,例如类Admin的实例可以访问的方法。

    【讨论】:

    • 我只是想直接从实例变量调用实例方法。你能引导我在 Rails 中找到一些很酷的方式吗
    • 我也检查过。但没有奏效。但我再试一次
    • @ImranNaqvi:问题在于active_users 是一个完全独立实例的方法,Admin 类型为Class,而不是@admin 类型为Admin
    • @SergioTulentsev 实际上没有移动到类方法有效。不知道为什么它在第一次尝试时不起作用。谢谢
    【解决方案2】:

    当您编写def self.something_method 时,方法将仅适用于类,如您的示例所示。如果你想为object 创建方法,你必须创建没有self 的方法,像这样:def something_method。 例如:

    class Admin
      def self.class_method
        p 'class method'
      end
    
      def something_method
        p 'method for object' 
      end
    end
    
    @admin = Admin.create(something_params)
     # You can also use 'Admin.new', but it will not save your admin in database, or 'Admin.first', like in your example.
    @admin.something_method
    #=> 'method for object'
    @admin.class_method
    #=> not working :( 
    
    Admin.something_method
    #=> not working :( 
    Admin.class_method
    #=> 'class method'
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2014-09-21
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多