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 i app/views/layouts/ (eller application om ingen matchning hittas)
  • en vy som heter index.html.erb i app/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 i PeopleController#index åtgärd som render 'index_new'
  • vi kan ställa in olika layouts för varje action genom att skriva render '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 din application.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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow