1

できるだけ多くのコードをモデルにリファクタリングすることがベストプラクティスであることを理解していますが、私はレールとプログラミング全体に比較的慣れていません。私に少し問題を引き起こしていると思われる概念の1つは、モデルの性質、およびメソッドと変数のスコープまたは可用性を理解することです。

まず、モデルに記述された典型的なメソッドで、メソッドを呼び出すことができる制限(スコープ)は何ですか?.selfアスペクトはどのように機能しますか?モデルで定義されたメソッドにアクセスできるコントローラー/ビューはどれですか?

これらはかなり基本的な原則であることは理解していますが、これに関する私の「仮定」が私にあらゆる種類の問題を引き起こしていると思います。

4

3 に答える 3

1

つまり、モデルへのアクセスに使用できるものに実際の制限はありません。技術的には、ビューとコントローラー、または他のモデルのモデルからメソッドを呼び出すことができます。

これが私がそれをどのように見るかです:

モデル=アプリケーションのロジック
ビュー=モデルのフロントエンド、ユーザー(またはサービス)に表示させたい部分を結び付け、
コントローラー=ビューとモデルの接着剤、モデルデータを呼び出し、ビューに渡します

モデルを自分の視点から直接呼び出すことは避けてください。コントローラ内のオブジェクトに対して1つまたは2つ以上の操作を実行している場合は、おそらくそれをモデルメソッドに移動する必要があります。

ここから、クラスの機能、インスタンスメソッド、クラスメソッドなどについて学ぶために、本を手に取っておくことをお勧めします。PragmaticProgrammersの「LearntoProgram」をお勧めします。 http://pragprog.com/book/ltp2/learn-to-program

そこから、MVCとは何か(そこにある多くの情報)について学びます。これは、モデル、ビュー、コントローラー、およびそれらがどのように関連しているかを理解するのに役立ちます。

于 2012-04-11T14:22:04.410 に答える
1

あなたの質問に基づいて、オブジェクト指向プログラミングとMVCパターンを読む必要があるように思われます。もちろん、これらはRailsだけのものではありません。

于 2012-04-11T14:22:49.883 に答える
1

Model-View-Controller(MVC)の場合:

  • モデルは、データ、およびデータに密接に関連するすべての機能(低レベルロジック)を保持します
  • コントローラはビ​​ジネスロジック(高レベルのアプリケーションロジック)を保持します
  • ビューはプレゼンテーション層(ユーザーインターフェイス)を保持します

ビューは、パブリックモデルメソッドにアクセスできます。(注:すべてのrubyメソッドはデフォルトでパブリックです。)もちろん、モデルオブジェクトは、適切なコントローラーメソッドで最初にインスタンス化する必要があり、コントローラー@personのローカル変数(ie person)ではなくインスタンス変数(ie)である必要があります。

コントローラは、パブリックモデルメソッドにもアクセスできます。

保護されたメソッドは、クラス内またはその子内へのアクセスを制限します。プライベートメソッドは、クラス内へのアクセスのみを制限します。

クラスメソッド、つまりdef Person.some_method ...、パブリック、プロテクト、プライベートとして定義されているかどうかに関係なく、どこにでも表示されているように見えますが、これは直感に反します。


自己についての質問について...モデル内からモデル自体のメソッドへのすべての呼び出しに自己を使用でき、間違いはありません。

たとえば、first_name列とlast_name列を持つPersonモデルの場合:

class Person < ActiveRecord::Base
  def full_name
    "#{self.first_name} #{self.last_name}"
  end

  def parse_name full
    self.first_name, self.last_name = full.split
  end
end

しかし、それはやり過ぎです。実際には、ActiveRecordで属性を取得するためにselfを使用する必要はなく、属性を設定するためだけに使用する必要があるため、次のように問題ありません。

class Person < ActiveRecord::Base
  def full_name
    "#{first_name} #{last_name}"
  end

  def parse_name full
    self.first_name, self.last_name = full.split
  end
end
于 2012-04-11T16:50:51.303 に答える