Ruby on Rails
Namnkonventioner
Sök…
controllers
Styrenhetens klassnamn är pluraliserade. Anledningen är att styrenheten styr flera instanser av objektinstans.
Exempel : OrdersController
är styrenheten för en orders
. Rails letar sedan efter klassdefinitionen i en fil som heter orders_controller.rb
i orders_controller.rb
/app/controllers
.
Exempel : PostsController
skulle vara styrenheten för en posts
.
Om kontrollerns klassnamn har flera stora bokstäver antas att tabellnamnet har understreck mellan dessa ord.
Exempel: Om en styrenhet heter PendingOrdersController
kommer antagna filnamn för denna controller att vara pending_orders_controller.rb
.
modeller
Modellen namnges med klassnamnskonventionen för obruten MixedCase och är alltid enskilt med tabellnamnet.
Exempel : Om en tabell fick orders
skulle den tillhörande modellen benämnas Order
Exempel : Om en tabell hette posts
, skulle den tillhörande modellen benämnas Post
Rails letar sedan efter klassdefinitionen i en fil som heter order.rb
i order.rb
/app/models
.
Om modellklassnamnet har flera stora bokstäver antas att tabellnamnet har understreck mellan dessa ord.
Till exempel: Om en modell heter BlogPost
kommer antagna blog_posts
att vara blog_posts
.
Visningar och layouter
När en kontrolleråtgärd görs kommer Rails att försöka hitta en matchande layout och vy baserat på kontrollerns namn.
Visningar och layouter placeras i app/views
.
Med tanke på en förfrågan till PeopleController#index
åtgärden kommer Rails att söka efter:
- den layout som kallas
people
iapp/views/layouts/
(ellerapplication
om ingen matchning hittas) - en vy som heter
index.html.erb
iapp/views/people/
standard - Om du vill göra en annan fil som heter
index_new.html.erb
måste du skriva kod för den iPeopleController#index
åtgärd somrender 'index_new'
- vi kan ställa in olika
layouts
för varjeaction
genom att skrivarender 'index_new', layout: 'your_layout_name'
Filnamn och autoladning
Rails-filer - och Ruby-filer i allmänhet - bör namnges med lower_snake_case
filnamn. T.ex
app/controllers/application_controller.rb
är filen som innehåller klassdefinitionen ApplicationController
. Observera att medan PascalCase
används för klass- och modulnamn, bör filerna där de finns fortfarande vara lower_snake_case
.
Konsekvent namngivning är viktigt eftersom Rails använder automatiskt inläsning av filer efter behov och använder "böjning" för att omvandla mellan olika namngivningsstilar, som att omvandla application_controller
till ApplicationController
och tillbaka igen.
Om Rails t.ex. ser att BlogPost
klassen inte finns (inte har laddats ännu) kommer den att leta efter en fil med namnet blog_post.rb
och försöka ladda den filen.
Det är därför också viktigt att namnge filer för vad de innehåller, eftersom autoloader förväntar sig att filnamn matchar innehåll. Om till exempel blog_post.rb
istället innehåller en klass som heter Just Post
, ser du en LoadError
: Expected [some path]/blog_post.rb to define BlogPost
.
Om du lägger till en dir under app/something/
(t.ex. / modeller / produkter /) och
- vill namnge utrymme moduler och klasser i nya dir så behöver du inte göra någonting och det kommer att laddas själv. Till exempel, i
app/models/products/ you would need to wrap your class in
modulprodukter. - vill inte namnutrymme-moduler och klasser i mitt nya dir, då måste du lägga till
config.autoload_paths += %W( #{config.root}/app/models/products )
till dinapplication.rb
till autoload.
En sak till att vara uppmärksam på (särskilt om engelska inte är ditt första språk) är det faktum att Rails står för oregelbundna plural substantiv på engelska. Så om du har en modell med namnet "Foot" måste motsvarande styrenhet kallas "FeetController" snarare än "FootsController" om du vill att "magisk" routing (och många fler sådana funktioner) ska fungera.
Modeller klass från Controller namn
Du kan få en modellklass från ett kontrollernamn på detta sätt (sammanhang är Controller klass):
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