Vous n'avez pas besoin d'une structure d'administration de rails lourds pour que les relations un-à-plusieurs fonctionnent.
Vous pouvez utiliser un échafaudage pour obtenir la plupart du chemin. Un peu plus de travail dans le contrôleur et dans la vue _form vous permettra de continuer le travail.
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 avons une bières table:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
Et développeurs tableau qui a une clé étrangère (beer_id) faisant référence à la table des bières:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Nous peut utiliser des échafaudages pour créer les deux tables:
$ rails g nom de bière d'échafaudage
rails $ Nom du promoteur d'échafaudage g beer_id: entier
La commande d'échafaudage crée les contrôleurs et les vues pour chaque modèle.
Nous devons modifier nos contrôleurs et les vues un peu pour obtenir le menu déroulant pour sélectionner une bière pour chaque développeur:
app/views/développeurs/_form.html.erb
remplacer le text_field généré et une étiquette pour beer_id de ce qui suit:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
app/controllers/developer_controller.rb
Modifier les méthodes nouvelles et modifier les attributs 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
L'échafaudage de rails est génial. 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
Tout ce que vous devez faire est de savoir quels sont les fichiers à modifier quand vous voulez plus que les opérations de base CRUD.
Espérons que ça aide. ~ Lex
Bonnes choses, John, merci. –
Pour tout un tas d'options possibles: https://www.ruby-toolbox.com/categories/rails_admin_interfaces – givanse