ruby on rails - polymorphic - Rieles: Andamio para hacer automáticamente una relación de uno a muchos
rails rollback migration (5)
Los andamios son andamios. Cuando quiere algo más que un CRUD en una mesa (que es lo que es / hace un andamio), necesita alterar el código de andamio generado, o hacer el suyo propio.
No estoy seguro de si estoy leyendo esto bien, pero parece que Scaffold no hará una relación de uno a varios en su totalidad. Por ejemplo, si creo messages
con scaffold y luego quiero comments
sobre esos messages
(un message
-> muchos comments
), tengo que revisar y cambiar todo. Por ejemplo, tengo que cambiar esto en la new
vista del comment
<% form_for(@comment) do |f| %>
a esto
<% form_for([@message, @comment]) do |f| %>
y luego cambie la acción para configurar @message
var ... entre otras cosas.
Esto no se puede hacer de forma automática con Scaffold, ¿verdad?
Sí. Scaffold funciona para un modelo y un 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.
Esto es cierto, pero no es el final de la historia. Hay al menos dos alternativas a Scaffold que funcionan bastante bien y automáticamente retoman las relaciones entre las clases (en función de los indicadores de relación de ActiveRecord como has_many). Una de estas alternativas es Optimizada y la otra es ActiveScaffold .
Son principalmente útiles para ingresar datos que su sistema requiere que no sean datos ingresados por el usuario. Por ejemplo, los utilizo para tareas administrativas en tablas donde no tiene sentido crear una IU completa para CRUD cuando una de las alternativas de andamios hará bien el trabajo para una característica que rara vez se usa. Sin embargo, no querrás usarlos para comentarios sobre mensajes.
Tenga en cuenta que hay proyectos como Hobo for Rails que le permiten mantener sus campos y asociaciones dentro del modelo en sí. No puedes andamiar asociaciones, pero es bastante cercano.
Terminas pagando por este azúcar al tener muchas más aplicaciones creadas a tus espaldas. En lugar de ganar el tuyo propio, generalmente estás restando lo que necesitas de un gran banco de conductas preconstruidas.
No necesita un marco de administración de rieles pesados para que funcionen las relaciones uno a muchos.
Puedes usar andamios para llegar la mayor parte del camino.
Un poco más de trabajo en el controlador y la vista _form te ayudarán el resto del camino hasta allí.
Así es 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 mesa de cervezas :
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
Y una tabla de desarrolladores que tiene una clave foránea (beer_id) que hace referencia a la tabla de cervezas:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Podemos usar andamios para crear ambas tablas:
nombre de la cerveza $ rails g andamio
$ rails g nombre de desarrollador de andamio beer_id: integer
El comando de andamio crea los controladores y vistas para cada modelo.
Tendremos que modificar un poco nuestros controles y vistas para que el menú desplegable seleccione una cerveza para cada desarrollador:
app / views / developers / _form.html.erb
Reemplace el text_field generado y la etiqueta para 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
Edite los métodos nuevos y de edición del controlador:
# 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
El andamio de Rails es genial. Mire 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 qué archivos modificar cuando quieras más que las operaciones CRUD básicas.
Espero que ayude. ~ Lex