1

現在、Ruby on Rails を使用していくつかのアプリを作成していますが、理解できていない概念がいくつかあります。

これらの 1 つは、「ルーティング」プロセスがどのように機能するかということです。つまり、ユーザーが URL 文字列を入力すると、Rails はその URL に応じて関連するアセットを提供します。

これが私が起こっていると思うことです:

  1. ユーザーは、ブラウザーを使用してサーバーを参照します。

    http://0.0.0.0:3000
    
  2. 次に、URL の前に文字列を追加します。

    http://0.0.0.0:3000/entries/view_all
    
  3. Rails の「routes.rb」ファイルは、ディレクティブを介して文字列が実際に関連付けられるべきものを指定します。

    match "/entries/view_all" => "entries#view_all"
    
  4. 上記のディレクティブは、文字列「/entries/view_all」が URL の先頭に追加された場合view_all、ファイル「entries_controller.rb」にあるメソッドを実行することを示しています。

  5. view_allメソッドが実行されます。

    def view_all
      @entries = Entry.all(:order => 'created_at DESC')
    end
    

    テーブル 'Entry' のすべてのエントリを定数@entriesに降順で割り当てます。

  6. Rails は魔法のように「view_all.html.erb」をユーザーに提供することを認識します。

  7. 「view_all.html.erb」内のeachループは、「エントリ」テーブルからの関連情報を表示します。

    <% @entries.each do |entry| %>
    <h1><%= entry.title %></h1> 
    <p><%= entry.content %></p>
    <p><em>Posted at <%= entry.created_at %></em></p>
    <% end %>
    

私の質問は次のとおりです。

  1. 物事がどのように機能するかについての私の概念はどれほど間違っていますか?
  2. view_all上記のステップ 3 で、Rails はメソッドが「entries_controller.rb」内にあることを実際にどのように認識しますか? ディレクティブはentries#view_allではなく でしentries#view_allた。Rails は「controllers」ディレクトリ内のコントローラ ファイル名の先頭を自動的に一致させ、「_controller.rb」を無視しますか?
  3. 上記のステップ 6 で、Rails は「view_all.html.erb」ビューを提供することを「魔法のように」どのように認識するのでしょうか? 質問 2 での動作と似ていますか? Rails は、ファイル名の「view_all」の部分を「entries_controller.rb」にあるメソッドの名前と一致させますか?
  4. object/constant@entriesとそのすべてのメソッドは、「entries_controller.rb」から「view_all.html.erb」にどのように「渡される」のですか?
4

3 に答える 3

3

(2) と (3) に対応して、Rails は構成よりも規約を重視しており、その結果、ルーター、コントローラー、およびビュー テンプレートが魔法のように結合されているように見えます。たとえば、次の行があるため、ルーターは がクラスを参照していることを認識しています。entriesEntriesControllerActionDispatch::Routing::RouteSet

def controller_reference(controller_param)
  controller_name = "#{controller_param.camelize}Controller"
  ...

これは魔法ではありません。「コントローラー」という言葉はハードコードされています。これは、Rails が与えられた入力を期待するようにプログラムされたものです。そして、それはいたるところでこのようなものであり、最初に理解するのは少し難しいかもしれません (このようなさらに困難な魔法については、Ember.js を参照してください)。

(4) への対応: Rails は、個々のインスタンス変数をインスタンスにコピーしActionViewます。コミュニティでは、本当にこれを行うべきかどうかについてかなりの論争がありますが、今のところはそのように動作するため、コントローラー アクションを作成するときはそのことを念頭に置いておく必要があります。ビューで必要のない多数のオブジェクトや肥大化したオブジェクトをコピーする際に、多くのオーバーヘッドが発生することは望ましくありません。

于 2013-05-08T23:42:12.607 に答える
2

実際、あなたはそれを手に入れました。すべて名前が一致しています。Entryモデルはentries_controller、ビューと一致する と一致しentriesます。特定のビューの名前は、コントローラーのアクションに関連付けられています。

@entries.で始まる変数と同様に、インスタンス変数 (モデル全体のインスタンスなどと呼ばれます) です@。コントローラー内のこれらの変数は、対応するビューで使用できるものです。

使用するための巧妙なトリックは、_enrtyパーシャルです。

_entry.html.erb

<h1><%= entry.title %></h1> 
<p><%= entry.content %></p>
<p><em>Posted at <%= entry.created_at %></em></p>

次に、 と呼びたい場所index(view_all通常は とラベル付けされていますindex)、またはその一部で、次のことができます。<%= render @entries %>

しかし、レールの魔法の多くは、マッチするマッチする命名規則にあります。すべてがカスタマイズ可能であるため、それを回避する方法はありますが、それは要約です. 乾杯!

于 2013-05-08T23:41:54.523 に答える
1

1)物事がどのように機能するかについての私の概念はどれほど間違っていますか?

これは、プロセスがどのように機能するかについて考える良い方法です

2) ステップ (3) で、Rails は実際に「view_all」メソッドが「entries_controller.rb」内にあることをどのように認識しますか? ディレクティブは「entries#view_all」ではなく「entries#view_all」でした。Rails は「controllers」ディレクトリ内のコントローラ ファイル名の先頭に自動的に一致し、「_controller.rb」を無視しますか?

Rails は「Convention over configuration」と呼ばれるディレクティブに従います。これは、Rails が期待する方法で指示を与える限り、Rails が特定の方法で動作することを意味します。したがって、上記のクエリでは、コントローラーの「エントリ」部分を指定しているため、「view_all」アクションの「entries_controller」を調べる必要があることがわかります

3) ステップ (6) で、Rails は「view_all.html.erb」ビューを提供することを「魔法のように」どのように認識しますか? 質問 2 での動作と似ていますか? rails は、ファイル名の「view_all」の部分を「entries_controller.rb」にあるメソッドの名前と一致させますか?

構成上の慣習、別名「魔法」。Rails がアクションを実行すると、要求に基づいて実行する一致するテンプレートが検索されます。json ページをリクエストした場合 (リクエスト ヘッダーを変更するなどして)、view.json.erb を探します。そのテンプレートを省略した場合、アクションの最後にレンダリング呼び出しを使用して何か他のことを行うように指示しない限り、エラーがスローされます。

4) オブジェクト/定数 '@entries' とそのすべてのメソッドは、'entries_controller.rb' から 'view_all.html.erb' にどのように '渡される' のですか?

それはただの :D ですか、それともその原因となっている Rails のソース コードを見せてほしいということですか?

ActionView (Views) と ActionController(Controllers) はどちらも Actionpack を継承しているため、両者の間で変数を共有することはそれほど難しくないと思います。

于 2013-05-08T23:49:13.760 に答える