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 のインスタンスではありません。実行したいことが機能することをテストするのは非常に簡単です。コントローラーのアクションの 1 つで、次のように記述します。

@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が のインスタンスAあり、ccが のクラス メソッドである場合、式 でA呼び出すことができます。cc@aaa.class.cc

于 2013-08-16T05:04:01.250 に答える