0

假设我有一个模型 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

4

2 回答 2

1

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

静态类方法必须以类对象为接收者调用,实例方法必须以实例方法为接收者调用。

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

回复评论:

那么 load() 返回的实例不是 A 类的实例。测试您想要做的工作非常简单:在您的控制器中的一个操作中编写:

@my_a = A.new
@my_a.do_stuff

然后在你的模型中写:

class A

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

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

日志/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
于 2013-08-16T05:05:04.190 回答
0

目前尚不清楚是做什么的load,但无论如何,如果@aaa是 的实例并且Acc的类方法A,那么您可以cc使用表达式调用@aaa.class.cc

于 2013-08-16T05:04:01.250 回答