サーチ…


コントローラ

コントローラのクラス名は複数形になっています。理由は、コントローラがオブジェクトインスタンスの複数のインスタンスを制御するためです。

OrdersControllerordersテーブルのコントローラになります。 Railsは/app/controllersディレクトリ/app/controllers orders_controller.rbというファイル内のクラス定義を探します。

PostsControllerpostsテーブルのコントローラになります。

コントローラのクラス名に大文字の単語が複数ある場合、テーブル名はこれらの単語の間にアンダースコアがあるものとみなされます。

たとえば、次のようにコントローラに名前が付いている場合PendingOrdersController 、このコントローラのファイル名を仮定しますpending_orders_controller.rb

モデル

このモデルは、途切れることのないMixedCaseのクラス命名規則を使用して命名され、常にテーブル名の単数形です。

:表の名前がorders場合、関連付けられたモデルの名前はOrder

:表の名前がposts場合、関連するモデルの名前はPost

Railsは/app/modelsディレクトリのorder.rbというファイルでクラス定義を探します。

モデルクラス名に複数の大文字の単語が含まれている場合、テーブル名はこれらの単語の間にアンダースコアがあるとみなされます。

例:モデルの名前がBlogPost場合、想定されるテーブル名はblog_postsになりblog_posts

ビューとレイアウト

コントローラのアクションがレンダリングされると、Railsはコントローラの名前に基づいて、一致するレイアウトを見つけようとします。

ビューとレイアウトは、 app/viewsディレクトリに配置されapp/views

PeopleController#indexアクションへのリクエストが与えられると、Railsは以下を検索します。

  • app/views/layouts/ (または一致するものが見つからない場合はapplication )のpeopleというレイアウト
  • デフォルトでapp/views/people/ index.html.erbというビュー
  • もしあなたがindex_new.html.erbというindex_new.html.erb他のファイルをレンダリングしたいのであれば、それをrender 'index_new'ようなrender 'index_new'アクションでPeopleController#index
  • render 'index_new', layout: 'your_layout_name'書くことで、すべてのactionに対して異なるlayoutsを設定できrender 'index_new', layout: 'your_layout_name'

ファイル名とオートローディング

Railsファイルと一般的なRubyファイルは、 lower_snake_caseファイル名で名前をlower_snake_case必要があります。例えば

app/controllers/application_controller.rb

ApplicationControllerクラス定義を含むファイルです。 PascalCaseはクラス名とモジュール名に使用されますが、それらが存在するファイルはlower_snake_caseなければなりlower_snake_case

Railsは必要に応じて自動ロードファイルを使用し、 application_controllerApplicationController変換して戻すなど、さまざまな命名スタイル間で変換するために "inflection"を使用するため、一貫した命名が重要です。

たとえば、 BlogPostクラスが存在しない(まだロードされていない)と見なされた場合、 blog_post.rbという名前のファイルが検索され、そのファイルがロードされます。

したがって、ファイルに名前を付けることも重要です。自動ローダーは、ファイル名がコンテンツに一致することを期待しているからです。たとえば、 blog_post.rbにjust Postという名前のクラスが含まれている場合は、 LoadErrorExpected [some path]/blog_post.rb to define BlogPost

app/something/ (例えば/ models / products /)の下にdirを追加すると

  • 新しいディレクトリ内のモジュールとクラスを名前空間にしたい場合、何もする必要はなく、それ自体が読み込まれます。例えば、 app/models/products/ you would need to wrap your class inモジュールProducts`にapp/models/products/ you would need to wrap your class in
  • 新しいディレクトリ内のモジュールとクラスの名前空間を使用したくない場合は、 config.autoload_paths += %W( #{config.root}/app/models/products )を追加して自動ロードするapplication.rbがあります。

特に英語が母国語でない場合には、Railsが英語で不規則な複数の名詞を扱うという事実に注意を払う必要があります。したがって、 "Foot"というモデルがあれば、レール "魔法"のルーティング(およびその他の多くの機能)を動作させたい場合は、対応するコントローラーを "FootsController"ではなく "FeetController"と呼ぶ必要があります。

コントローラ名からのモデルクラス

このようにコントローラ名からModelクラスを取得できます(コンテキストはControllerクラス)。

class MyModelController < ActionController::Base

  # Returns corresponding model class for this controller
  # @return [ActiveRecord::Base]
  def corresponding_model_class
    # ... add some validation
    controller_name.classify.constantize
  end
end


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow