从控制器实例变量访问静态方法

时间:2013-08-16 04:17:09

标签: ruby-on-rails ruby

假设我有一个类似A的模型:

class A
  def self.base_attributes
    {:state_a => nil}
  end 

  def self.aa(params)
    instance = load
    instance.state_a = {:xx => params[:x]...}
    instance
  end

  def cc(x)
    self.state_a[..] = x
    self.save!
  end
end

我有一个控制器B,如:

controller B
  def mtd
    @aaa = A.aa(params)
    #operations to get y
    @aaa.cc(y)
  end
end

有没有办法让模型方法cc(x)成为静态方法,并从控制器的实例变量(@aaa)中调用它?

2 个答案:

答案 0 :(得分:1)

  

有没有办法让模型方法cc(x)成为静态的   方法并从控制器的实例变量中调用它   (@aaa)?

必须使用类对象作为接收器调用 static 类方法,并且必须使用实例方法作为接收器调用实例方法。

如果要用实例调用它,为什么要关心它是什么类型的方法?

对评论的回应:

然后load()返回的实例不是A类的实例。测试你想要做的事情非常简单:在你的控制器中的一个动作中写:

@my_a = A.new
@my_a.do_stuff

然后在你的模型中写:

class A

  def do_stuff
    logger.debug "do_stuff was called"
  end
  ...
  ...
end

然后使用正确的URL,或单击正确的链接以执行该操作。然后查看文件的底部:

  

log / development.log

...你会看到一行:

"do_stuff was called"

您还可以通过写入来记录load()返回的对象的类型:

  def self.aa(params)
    instance = load
    logger.debug instance.class  #<===ADD THIS LINE
    instance.state_a = {:xx => params[:x]...}
    instance
  end

答案 1 :(得分:0)

目前尚不清楚load的作用,但无论如何,如果@aaaA实例cc是一个类A的方法,然后您可以使用表达式cc调用@aaa.class.cc