访问类实例变量

时间:2015-06-14 17:29:30

标签: ruby-on-rails ruby variables

如何读取类变量?就我而言,我无法从变量获得价值。

Reserves (bid:INT, sid:INT, day:DATE)

2 个答案:

答案 0 :(得分:1)

首先,@randomUsrId引用实例变量,而不是类变量。您可以通过类的实例访问它,而不是直接在类上访问它。对于类变量,您应该使用@@randomUsrId

您实际需要的是attr_accessor :randomUsrId,通过此,您可以在实例方法上阅读它,甚至可以通过类的实例进行设置。

以下是:

class MediaContentsController < ApplicationController
  attr_accessor :randomUsrId

  @randomUsrId = rand(100)

  def create
    puts @randomUsrId
  end
end

但是@randomUsrId = rand(100)不会将@randomUsrId设置为随机数,至少不是推荐方式。你应该在这里使用before_action

class MediaContentsController < ApplicationController
  attr_accessor :randomUsrId
  before_action :set_user_id_to_a_random_number, only: :create

  def create
    puts @randomUsrId
  end

  private
  def set_user_id_to_a_random_number
    @randomUsrId = rand(100)
  end
end

修改

每次调用set_user_id_to_a_random_number函数时,它都会根据rand(100)生成不同的数字,并将其存储在@randomUsrId内。如果那是您不想要的,并且您希望保持相同的值,您可以执行以下操作:

def set_user_id_to_a_random_number
  @randomUsrId = rand(100) unless defined? @randomUsrId
end

修改

我所说的只适用于一个请求,如果您有多个请求,它将无效。正如瑞安贝茨所说here

  

实例变量仅适用于单个请求,因此,如果您需要为每个请求多次调用方法,则使用所描述的技术只会使您受益。

如果您想在多个请求之间存储内容,那么您将有两个选项。您可以使用数据库,也可以使用名为memcached的内容。

答案 1 :(得分:0)

你可能在代码中做错了,因为这不是Rails控制器逻辑通常应该如何实现的,但是无论如何我们都要回答你的问题。正如我所提到的,它不是类变量,它是类范围中的实例变量,所以为了访问它,你应该首先从该范围获取它:

class MediaContentsController

  @randomUsrId = rand(100)

  def create
    puts self.class.get_random_usr_id
  end

  def self.get_random_usr_id
    @randomUsrId
  end
end


MediaContentsController.new.create
# => 44