2009-02-02 15 views
14

No estoy seguro si estoy leyendo this 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 en esos messages (uno message -> muchos comments), tengo que revisar y cambiar todo. Por ejemplo, tengo que cambiar esto en vista de la newcomment 'sRaíles: Andamio para hacer automáticamente una relación uno a muchos

<% form_for(@comment) do |f| %> 

a este

<% form_for([@message, @comment]) do |f| %> 

y luego cambiar la acción para establecer la @message var ... entre otras cosas.

Esto no se puede hacer de forma automática con Scaffold, ¿verdad?

Respuesta

12

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 Streamlined 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.

+1

Cosas buenas, John, gracias. –

+0

Para un montón de opciones posibles: https://www.ruby-toolbox.com/categories/rails_admin_interfaces – givanse

13

Sí. Scaffold funciona para un modelo y un controlador relacionado. No cuida ni trabaja con las relaciones.

El objetivo principal de Scaffold es ejecutar CRUD en un modelo utilizando un controlador y vistas relacionadas. Eso es todo. Cualquier otro requisito, como las relaciones, debe codificarse manualmente.

+1

Excelente. Todavía ahorra un poco de trabajo ... Imagino/sueño que en el futuro también hará las relaciones. –

+0

Sí. Y me imagino una aplicación que escribe una aplicación de rieles con arrastrar y soltar y una configuración mínima. Va a suceder. ¡Pronto! :) – Chirantan

+0

Me imagino que ya has visto la gema Admin, ¿verdad? –

1

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.

+0

Gracias por eso.Me gustaría dejar de rodar, pero en 2009 todavía se trata de rodar uno propio. –

3

Tenga en cuenta que hay proyectos como Hobo para Rails que le permiten mantener sus campos y asociaciones dentro del modelo en sí. No puedes andamiar asociaciones, pero es bastante cercano.

Usted termina pagando por este azúcar al tener muchas más aplicaciones construidas detrás de su espalda. En lugar de ganar el tuyo propio, generalmente estás restando lo que necesitas de un gran banco de conductas preconstruidas.

+0

Genial, gracias, lo comprobaré. Ahora mismo no uso Scaffold alguna vez, pero incluso estoy usando el material REST bastante ... –

1

No necesita un marco de administración de rieles pesados ​​para que las relaciones uno a muchos funcionen.

Puede usar andamios para llegar la mayor parte del camino.

Un poco más de trabajo en el controlador y la vista _form le llevará el resto del camino hasta allí.

Así es como ...

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 un cervezas tabla:

create_table "beers", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Y un desarrolladores tabla que tiene una clave externa (beer_id) referencia a la tabla cervezas:

create_table "developers", force: true do |t| 
    t.string "name" 
    t.integer "beer_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Nosotros puede usar andamios para crear ambas tablas:

$ g carriles de andamio nombre de la cerveza

$ carriles nombre del desarrollador g andamio beer_id: entero

El comando crea andamio de los controladores y vistas para cada modelo.

Tendremos que modificar nuestros controladores y vistas un poco para obtener el menú desplegable para seleccionar una cerveza para cada desarrollador:

app/views/desarrolladores/_form.html.erb

Sustituir el text_field generada y una 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

Edición del controlador y editar nuevos métodos:

# 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 

Pantallas

enter image description here

enter image description here

enter image description here

Notas

Andamios de rieles es genial. Mira 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 tiene que hacer es saber qué archivos se deben modificar cuando desee más que las operaciones básicas CRUD.

Espero que ayude. ~ Lex

Cuestiones relacionadas