Rails:Andamio para hacer automáticamente de uno a muchos relación
-
20-08-2019 - |
Pregunta
No estoy seguro si estoy leyendo este a la derecha, pero parece que el Andamio no va a hacer una relación de uno a muchos relación en su totalidad.Por ejemplo, si creo messages
con andamio y, a continuación, quiero comments
en los messages
(uno message
-> muchas comments
), Tengo que ir a través y cambiar todo.Por ejemplo, tengo que cambiar esto en el comment
's new
ver
<% form_for(@comment) do |f| %>
a este
<% form_for([@message, @comment]) do |f| %>
y, a continuación, cambiar la Acción para establecer la @message
var...entre otras cosas.
Esto actualmente no se puede hacer automáticamente con Andamio, ¿verdad?
Solución
Esto es cierto, pero, no es el fin de la historia.Hay al menos dos alternativas para Andamio que ambos trabajan muy bien y automáticamente recoger en las relaciones entre las clases (basado en su ActiveRecord relación de indicadores como has_many).Una de estas alternativas es Racionalización de y la otra es ActiveScaffold.
Son útiles principalmente para entrar en los datos que su sistema requiere que no es usuario de los datos de entrada.Por ejemplo, yo los uso para tareas administrativas en las mesas donde no hay ningún punto en la construcción de una completa interfaz de usuario para el CRUD cuando uno de los andamios alternativas va a hacer el trabajo igual de bien para una rara característica.Usted no quiere hacer uso de ellos para comentarios sobre los mensajes de pesar.
Otros consejos
Sí Scaffold funciona para un modelo y controlador relacionado. No cuida ni trabaja con las relaciones.
El objetivo principal de Scaffold es hacer que CRUD funcione en un modelo usando un controlador y vistas relacionadas. Eso es todo. Cualquier otro requisito, como las relaciones, debe codificarse manualmente.
Tenga en cuenta que hay proyectos como Hobo para Rails que le permiten mantener sus campos y asociaciones dentro del modelo mismo . No se pueden andamiar asociaciones, pero está bastante cerca.
Terminas pagando por este azúcar al tener mucha más aplicación desarrollada a tus espaldas. En lugar de rodar el suyo, generalmente resta lo que necesita de un gran banco de comportamientos preconstruidos.
Usted no necesita un pesado rieles de administración de marco para conseguir uno-a-muchos de las relaciones de trabajo.
Usted puede utilizar el andamiaje para obtener la mayor parte del camino.
Un poco más de trabajo en el controlador y _form ver conseguirá que el resto del camino.
He aquí cómo...
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>
Suponiendo que tenemos una cervezas tabla:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
Y un los desarrolladores tabla que tiene una clave externa (beer_id) hacer referencia a las cervezas tabla:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Podemos utilizar el andamiaje para crear dos tablas:
$ rails g andamio de la cerveza de nombre
$ rails g andamio nombre de desarrollador beer_id:integer
El andamio comando crea los controladores y las vistas de cada modelo.
Vamos a necesitar modificar nuestros controladores y las vistas un poco para obtener el menú desplegable para seleccionar una cerveza para cada desarrollador:
app/views/desarrolladores/_form.html.erb
Reemplace el generado text_field y la etiqueta de la beer_id con lo siguiente:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
app/controllers/developer_controller.rb
Editar el controlador de nuevo y métodos de edición:
# 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
Capturas De Pantalla
Notas
Rieles de andamios es grande.Buscar en todos los archivos que crea para usted:
$ 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
Todo lo que tienes que hacer es saber que archivos modificar cuando se desee más que la base de operaciones CRUD.
Espero que ayude.~ Lex
Los andamios son andamios. Cuando desee algo más que un CRUD en una mesa (que es lo que es / hace un andamio), debe alterar el código de andamio generado o rodar el suyo.