Rails: Échafaudage pour faire automatiquement une relation un à plusieurs
-
20-08-2019 - |
Question
Je ne sais pas si je lis ce droit , mais il semble que Scaffold ne fasse pas de relation un à plusieurs. dans son intégralité. Par exemple, si je crée messages
avec un échafaudage et que je veux comments
ensuite sur ceux-ci message
(un comment
- & Gt; plusieurs new
), je dois tout modifier. Par exemple, je dois changer cela dans la vue @message
de <=>
<% form_for(@comment) do |f| %>
à ceci
<% form_for([@message, @comment]) do |f| %>
puis modifiez l'action pour configurer la <=> var ... entre autres.
Cela ne peut actuellement pas être fait automatiquement avec Scaffold, n'est-ce pas?
La solution
C'est vrai, mais ce n'est pas la fin de l'histoire. Il existe au moins deux alternatives à Scaffold: les deux fonctionnent très bien et détectent automatiquement les relations entre les classes (en fonction de vos indicateurs de relation ActiveRecord tels que has_many). Une de ces solutions est simplifiée et l'autre ActiveScaffold .
Ils sont principalement utiles pour la saisie des données requises par votre système qui ne sont pas des données saisies par l'utilisateur. Par exemple, je les utilise pour des tâches administratives sur des tables où il ne sert à rien de créer une interface utilisateur complète pour CRUD alors que l'une des alternatives d'échafaudage fera l'affaire avec une fonctionnalité rarement utilisée. Vous ne voudriez cependant pas les utiliser pour commenter des messages.
Autres conseils
Oui. Échafaudage fonctionne pour un modèle et un contrôleur associé. Il ne prend pas soin de ou ne travaille pas avec les relations.
L'objectif principal de Scaffold est de permettre à CRUD d'utiliser un modèle à l'aide d'un contrôleur et de vues associées. C'est tout. Toute autre exigence telle que les relations doit être codée manuellement.
Notez qu'il existe des projets tels que Hobo pour Rails qui vous permettent de conserver vos champs et associations dans le modèle lui-même. . Vous ne pouvez pas échafauder d'associations, mais c'est assez proche.
Vous finissez par payer pour ce sucre en ayant beaucoup plus d'application construite dans votre dos. Au lieu de vous lancer vous-même, vous soustrayez généralement ce dont vous avez besoin d’une vaste banque de comportements préconçus.
Vous n'avez pas besoin d'un framework d'administration lourd pour faire fonctionner les relations un à plusieurs.
Vous pouvez utiliser un échafaudage pour atteindre le maximum.
Un peu plus de travail dans la vue Contrôleur et _form vous permettra de continuer.
Voici comment ...
Story: Select a beer for a developer
In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer
Scenario 1: Select beer for new developer
Given I have clicked the <new> button and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
En supposant que nous ayons un tableau des bières :
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
Et une table développeurs comportant une clé étrangère (beer_id) référençant la table beers:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Nous pouvons utiliser un échafaudage pour créer les deux tables:
$ rails g nom de bière d'échafaudage
$ rails g nom du développeur d'échafaudage beer_id: entier
La commande scaffold crée les contrôleurs et les vues pour chaque modèle.
Nous devrons modifier un peu nos contrôleurs et nos vues pour que le menu déroulant sélectionne une bière pour chaque développeur:
app / views / developers / _form.html.erb
Remplacez les champs text_field et label générés par beer_id par les éléments suivants:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
app / controllers / developer_controller.rb
Modifiez les nouvelles méthodes et les méthodes d'édition du contrôleur:
# GET /developers/new
def new
@developer = Developer.new
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
# GET /developers/1/edit
def edit
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
Captures d'écran
Notes
Les échafaudages sur rails sont excellents. Regardez tous les fichiers qu'il crée pour vous:
$ be rails g scaffold beer name
invoke active_record
create db/migrate/20140912144218_create_beers.rb
create app/models/beer.rb
invoke rspec
create spec/models/beer_spec.rb
invoke factory_girl
create spec/factories/beers.rb
invoke resource_route
route resources :beers
invoke scaffold_controller
create app/controllers/beers_controller.rb
invoke erb
create app/views/beers
create app/views/beers/index.html.erb
create app/views/beers/edit.html.erb
create app/views/beers/show.html.erb
create app/views/beers/new.html.erb
create app/views/beers/_form.html.erb
invoke rspec
create spec/controllers/beers_controller_spec.rb
create spec/views/beers/edit.html.erb_spec.rb
create spec/views/beers/index.html.erb_spec.rb
create spec/views/beers/new.html.erb_spec.rb
create spec/views/beers/show.html.erb_spec.rb
create spec/routing/beers_routing_spec.rb
invoke rspec
create spec/requests/beers_spec.rb
invoke helper
create app/helpers/beers_helper.rb
invoke rspec
create spec/helpers/beers_helper_spec.rb
invoke jbuilder
create app/views/beers/index.json.jbuilder
create app/views/beers/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/beers.js.coffee
invoke scss
create app/assets/stylesheets/beers.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
Il vous suffit de savoir quels fichiers modifier lorsque vous souhaitez effectuer davantage que des opérations CRUD de base.
J'espère que ça aide. ~ Lex
Les échafaudages sont des échafaudages. Si vous souhaitez autre chose qu'un CRUD sur une table (c'est ce qu'un échafaudage est / fait), vous devez modifier le code d'échafaudage généré ou lancer le vôtre.