Ruby on Rails
命名規則
サーチ…
コントローラ
コントローラのクラス名は複数形になっています。理由は、コントローラがオブジェクトインスタンスの複数のインスタンスを制御するためです。
例 : OrdersController
はorders
テーブルのコントローラになります。 Railsは/app/controllers
ディレクトリ/app/controllers
orders_controller.rb
というファイル内のクラス定義を探します。
例 : PostsController
はposts
テーブルのコントローラになります。
コントローラのクラス名に大文字の単語が複数ある場合、テーブル名はこれらの単語の間にアンダースコアがあるものとみなされます。
たとえば、次のようにコントローラに名前が付いている場合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_controller
をApplicationController
変換して戻すなど、さまざまな命名スタイル間で変換するために "inflection"を使用するため、一貫した命名が重要です。
たとえば、 BlogPost
クラスが存在しない(まだロードされていない)と見なされた場合、 blog_post.rb
という名前のファイルが検索され、そのファイルがロードされます。
したがって、ファイルに名前を付けることも重要です。自動ローダーは、ファイル名がコンテンツに一致することを期待しているからです。たとえば、 blog_post.rb
にjust Post
という名前のクラスが含まれている場合は、 LoadError
: Expected [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