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 in app/views/layouts/ (of application als er geen overeenkomst wordt gevonden)
  • een weergave met de naam index.html.erb in app/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 in PeopleController#index zoals render 'index_new'
  • we kunnen verschillende layouts voor elke action door render '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 Products app/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 je config.autoload_paths += %W( #{config.root}/app/models/products ) aan je application.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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow