假设我有一个类似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
)中调用它?
答案 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
的作用,但无论如何,如果@aaa
是A
的实例且cc
是一个类A
的方法,然后您可以使用表达式cc
调用@aaa.class.cc
。