Ruby on Rails
Konwencje nazewnictwa
Szukaj…
Kontrolery
Nazwy klas kontrolerów są pluralizowane. Powodem jest to, że kontroler kontroluje wiele instancji obiektu.
Na przykład : OrdersController
będzie kontrolerem tabeli orders
. Railsy będą wtedy szukać definicji klasy w pliku o nazwie orders_controller.rb
w katalogu /app/controllers
.
Na przykład : PostsController
będzie kontrolerem dla tabeli posts
.
Jeśli nazwa klasy kontrolera zawiera wiele słów pisanych wielkimi literami, zakłada się, że nazwa tabeli zawiera podkreślenia między tymi słowami.
Na przykład: jeśli kontroler ma nazwę PendingOrdersController
wówczas zakładana nazwa pliku dla tego kontrolera to pending_orders_controller.rb
.
Modele
Model jest nazywany przy użyciu konwencji nazewnictwa klas nieprzerwanego MixedCase i jest zawsze liczbą pojedynczą w nazwie tabeli.
Na przykład : jeśli tabela została nazwana orders
, skojarzony model miałby nazwę Order
Na przykład : jeśli tabela została nazwana posts
, skojarzony model miałby nazwę Post
Railsy będą wtedy szukać definicji klasy w pliku o nazwie order.rb
w katalogu /app/models
.
Jeśli nazwa klasy modelu zawiera wiele słów pisanych wielkimi literami, zakłada się, że nazwa tabeli zawiera podkreślenia między tymi słowami.
Na przykład: jeśli model nosi nazwę BlogPost
wówczas zakładana nazwa tabeli to blog_posts
.
Widoki i układy
Kiedy renderowana jest akcja kontrolera, Railsy będą próbowały znaleźć pasujący układ i widok na podstawie nazwy kontrolera.
Widoki i układy są umieszczane w katalogu app/views
.
Po otrzymaniu żądania akcji PeopleController#index
, Railsy będą szukać:
- układ o nazwie
people
wapp/views/layouts/
(lubapplication
jeśli nie znaleziono dopasowania) - widok o nazwie
index.html.erb
wapp/views/people/
domyślnie - jeśli chcesz wyrenderować inny plik o nazwie
index_new.html.erb
, musisz napisać do niego kod w akcjiPeopleController#index
np.render 'index_new'
- możemy ustawić różne
layouts
dla każdejaction
, piszącrender 'index_new', layout: 'your_layout_name'
Nazwy plików i automatyczne ładowanie
Pliki Rails - i ogólnie pliki Ruby - powinny być nazywane lower_snake_case
plików lower_snake_case
. Na przykład
app/controllers/application_controller.rb
to plik zawierający definicję klasy ApplicationController
. Zwróć uwagę, że chociaż PascalCase
jest używany do nazw klas i modułów, pliki, w których się znajdują, powinny nadal mieć wartość lower_snake_case
.
Konsekwentne nazewnictwo jest ważne, ponieważ Railsy używają automatycznie ładujących się plików w razie potrzeby i używają „przegięcia” do transformacji między różnymi stylami nazewnictwa, takimi jak transformacja application_controller
do ApplicationController
iz powrotem.
Np. Jeśli Railsy BlogPost
klasa BlogPost
nie istnieje (nie została jeszcze załadowana), poszuka pliku o nazwie blog_post.rb
i spróbuje załadować ten plik.
Dlatego ważne jest także nadawanie nazw plikom według ich zawartości, ponieważ autoloader oczekuje, że nazwy plików będą pasować do zawartości. Jeśli na przykład blog_post.rb
zawiera klasę o nazwie Post
, zobaczysz komunikat LoadError
: Expected [some path]/blog_post.rb to define BlogPost
.
Jeśli dodasz katalog pod app/something/
(np. / Models / products /), i
- chcesz nadać modułom i klasom przestrzeni nazw nowy katalog, wtedy nie musisz nic robić i sam się załaduje. Na przykład w
app/models/products/ you would need to wrap your class in
moduł Produkty. - nie chcę nazywać modułów i klas przestrzeni nazw wewnątrz mojego nowego
config.autoload_paths += %W( #{config.root}/app/models/products )
wtedy musisz dodaćconfig.autoload_paths += %W( #{config.root}/app/models/products )
doapplication.rb
aby automatycznie załadować.
Jeszcze jedną rzeczą, na którą należy zwrócić uwagę (zwłaszcza jeśli angielski nie jest twoim pierwszym językiem), to fakt, że Railsy tłumaczą nieregularne liczby mnogie w języku angielskim. Więc jeśli masz model o nazwie „Foot”, odpowiedni kontroler musi być nazwany „FeetController”, a nie „FootsController”, jeśli chcesz, aby działało „magiczne” routing (i wiele innych takich funkcji).
Klasa modeli od nazwy kontrolera
W ten sposób można uzyskać klasę modelu z nazwy kontrolera (kontekst to klasa kontrolera):
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