4

Code School Rails のテスト コースを見ています。クラスのインスタンスがありますzombiezombieモデルにはメソッドがあります。

def avatar_url
  ...
end

テスト内では、.rbファイルには次のものがあります。

z.avatar_url
  1. このようなメソッドを呼び出す場合、Rails はコントローラーまたはモデル メソッドを呼び出しているかどうかをどのように区別しますか? コントローラー以外からモデルメソッドを呼び出すことは考えていませModel.methodんでしobject.methodた。
  2. コントローラーとモデルの両方に同じ名前のメソッドがある場合、Rails はどちらを呼び出すべきかをどのように判断しますか?

アップデート:

クラス String を例に取りましょう。これはモデルではありませんよね?

だから私は言うことができます:

s = String.new
s.capitalize

この呼び出しがモデルでもコントローラーでもない場合、どこに行くのでしょうか? String のようなクラスは、Rails ディレクトリのどこに定義されますか?

4

3 に答える 3

4

Ruby と Rails は初めてのようです。Ruby では、クラスはオブジェクトの型の記述のようなものです (ただし、クラス自体もオブジェクトです)。クラスが定義されている場合はいつでも、 と同様に、その新しいインスタンスを作成できますString.new。クラスの名前は常に大文字であることに注意してください。

クラス メソッドは、クラス自体で動作するメソッドです。メソッドはクラスの大文字の名前に付けられるため ( のようにString.new)、メソッドがクラス メソッドであることがわかります。一方、インスタンス メソッドは、クラス自体ではなく、クラスのインスタンスでのみ機能します (例: str = String.new; str.capitalize!)。インスタンスは実際に作業しているものであるため、通常はクラス メソッドよりも多くのインスタンス メソッドがあります (newは最も一般的なクラス メソッドです)。

他の人がここで述べたように、String は Rails モデルではありません。これは基本的な Ruby クラスです。Rails で作業しているときは、すべての通常の Ruby クラスだけでなく、Rails のソース コード内で定義されている他のクラスやメソッドにもアクセスできます。そのため、Rails 自体では String は定義されていませんが、Rails は文字列用の便利なインスタンス メソッドをいくつか提供しています (例: str.to_date)。

Rails のモデルは、実際には単なる Ruby クラスです。モデルの仕組みを理解するには、Ruby のクラスがどのように機能するかを理解しておく必要があります。Rails モデルが特別なのは、ActiveRecord として知られる Rails のソース コードで定義されたクラスから継承することです (Ruby のどのクラスも別のクラスから継承できます。これはその一例にすぎません)。ActiveRecord には多数のクラス メソッドとインスタンス メソッドがあり、それらは ActiveRecord から継承されているため、モデルでも使用できます。たとえば、Person というクラス (モデル) がある場合、Person.find(id)クラス メソッドを自動的に使用して、データベース内の Person クラスの特定のインスタンスを検索できます。person.saveインスタンスをデータベースに保存するインスタンス メソッドもあります。

私が最初に始めたとき、これらすべてが私を混乱させたので、私の最善のアドバイスは、Rails を学ぶときに Ruby に慣れることです。

于 2013-09-05T16:42:59.873 に答える
2

Rails のどこからでも Model クラス/インスタンス メソッドを呼び出すことができます。モデルはデータベースへの単なるマッピングであり、データベースのプロキシとして機能します。あなたが電話しているとき

z.avatar_url

「z」モデルインスタンスでメソッドを呼び出しています。したがって、どこから呼び出しても、常にモデルのメソッドが呼び出されます。

コントローラーとモデルの両方で同じ名前のメソッドを定義すると、常にモデル インスタンスまたはモデル クラスでモデルのメソッドを呼び出すことになります。コントローラ メソッドは、Rails では単純なアクションであり、どこからも直接参照されることはありません。これらは Rails のルーティングに使用されます。

私がはっきりしていることを願っています。

于 2013-09-05T12:24:42.593 に答える