Ruby on Rails
Naamgevingsconventies
Zoeken…
Controllers
Namen van controllerklassen zijn meervoudig. De reden is dat de controller meerdere instanties van een objectinstantie bestuurt.
Bijvoorbeeld: OrdersController
zou de regelinrichting voor een te orders
tabel. Rails zoekt vervolgens naar de klassedefinitie in een bestand met de naam orders_controller.rb
in de map /app/controllers
.
Bijvoorbeeld : PostsController
zou de controller zijn voor een posts
tabel.
Als de naam van de controllerklasse meerdere hoofdletters bevat, wordt ervan uitgegaan dat de tabelnaam onderstrepingstekens tussen deze woorden heeft.
Bijvoorbeeld: als een controller de naam PendingOrdersController
wordt aangenomen dat de bestandsnaam voor deze controller pending_orders_controller.rb
.
modellen
Het model wordt genoemd met behulp van de klassennaamconventie van ongebroken MixedCase en is altijd het enkelvoud van de tabelnaam.
Bijvoorbeeld : als een tabel orders
zou orders
, zou het bijbehorende model Order
worden genoemd
Bijvoorbeeld : als een tabel posts
zou posts
, zou het bijbehorende model de naam Post
Rails zoekt vervolgens naar de klassedefinitie in een bestand met de naam order.rb
in de map /app/models
.
Als de modelklasse meerdere hoofdletters bevat, wordt ervan uitgegaan dat de tabelnaam onderstrepingstekens tussen deze woorden heeft.
Bijvoorbeeld: als een model BlogPost
wordt aangenomen dat de tabelnaam blog_posts
.
Aanzichten en lay-outs
Wanneer een controlleractie wordt weergegeven, probeert Rails een overeenkomende lay-out en weergave te vinden op basis van de naam van de controller.
Weergaven en lay-outs worden in de map app/views
.
Op verzoek van de PeopleController#index
zal Rails zoeken naar:
- de lay-out met de naam
people
inapp/views/layouts/
(ofapplication
als er geen overeenkomst wordt gevonden) - een weergave met de naam
index.html.erb
inapp/views/people/
standaard - als u een ander bestand met de naam
index_new.html.erb
wilt renderen,index_new.html.erb
u daarvoor code schrijven inPeopleController#index
zoalsrender 'index_new'
- we kunnen verschillende
layouts
voor elkeaction
doorrender 'index_new', layout: 'your_layout_name'
Bestandsnamen en automatisch laden
Rails-bestanden - en Ruby-bestanden in het algemeen - moeten een naam krijgen met de bestandsnamen lower_snake_case
. Eg
app/controllers/application_controller.rb
is het bestand dat de ApplicationController
-klassedefinitie bevat. Merk op dat hoewel PascalCase
wordt gebruikt voor klasse- en modulenamen, de bestanden waarin ze zich bevinden nog steeds lower_snake_case
moeten zijn.
Consistente naamgeving is belangrijk omdat Rails indien nodig automatisch laden van bestanden gebruikt en "inflection" gebruikt om te transformeren tussen verschillende naamgevingsstijlen, zoals het transformeren van application_controller
naar ApplicationController
en weer terug.
Als Rails bijvoorbeeld ziet dat de BlogPost
klasse niet bestaat (nog niet is geladen), zoekt deze naar een bestand met de naam blog_post.rb
en probeert dat bestand te laden.
Het is daarom ook belangrijk om bestanden een naam te geven voor wat ze bevatten, omdat de autoloader verwacht dat de bestandsnamen overeenkomen met de inhoud. Als bijvoorbeeld blog_post.rb
plaats daarvan een klasse met de naam Alleen Post
, ziet u een LoadError
: Expected [some path]/blog_post.rb to define BlogPost
.
Als u een map toevoegt onder app/something/
(bijv. / Modellen / producten /), en
- Wil je modules en klassen een naam geven in een nieuwe map, dan hoef je niets te doen en wordt het zelf geladen. In
app/models/products/ you would need to wrap your class in
module Productsapp/models/products/ you would need to wrap your class in
. - wil geen modules en klassen in mijn nieuwe
config.autoload_paths += %W( #{config.root}/app/models/products )
naamruimte geven, dan moet jeconfig.autoload_paths += %W( #{config.root}/app/models/products )
aan jeapplication.rb
aan autoload.
Nog een ding om op te letten (vooral als Engels niet je eerste taal is) is het feit dat Rails verantwoordelijk is voor onregelmatige meervoudsnamen in het Engels. Dus als u een model met de naam "Foot" hebt, moet de bijbehorende controller "FeetController" worden genoemd in plaats van "FootsController" als u wilt dat rails "magic" routing (en nog veel meer van dergelijke functies) werken.
Modellen klasse van controller naam
U kunt op deze manier een modelklasse van een controller-naam krijgen (context is controller-klasse):
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