2008-09-15 5 views
59

Tengo una aplicación de rieles donde los usuarios tienen que iniciar sesión. Por lo tanto, para que la aplicación sea utilizable, debe haber un usuario inicial en el sistema para el primera persona para iniciar sesión (pueden crear usuarios posteriores). Hasta ahora he usado una migración para agregar un usuario especial a la base de datos.Cómo (y si) rellenar la aplicación de rieles con datos iniciales

Después de preguntar this question, parece que debería usar db: schema: cargar, en lugar de ejecutar las migraciones, para configurar nuevas bases de datos en nuevas máquinas de desarrollo. Desafortunadamente, esto no parece incluir las migraciones, que insertan datos, sólo aquellos que estableció las tablas, claves, etc.

Mi pregunta es, ¿cuál es la mejor manera de manejar esta situación:

  1. ¿Hay una forma de obtener d: s: l para incluir migraciones de inserción de datos?
  2. ¿No debería utilizar migraciones para insertar datos de esta manera?
  3. ¿No debería rellenar previamente la base de datos con datos? ¿Debo actualizar el código de la aplicación para que maneje el caso donde no hay usuarios con elegancia, y permite que se cree una cuenta de usuario inicial en vivo desde la aplicación?
  4. ¿Alguna otra opción? :)

Respuesta

4

pensé que había resumir algunas de las grandes respuestas que he tenido a esta pregunta, junto con mi propia pensamientos ahora los he leído todos :)

Hay dos cuestiones distintas aquí:

  1. ¿Debo rellenar previamente la base de datos con mi usuario especial 'admin'? ¿O debería la aplicación proporcionar una forma de configurarla cuando se usa por primera vez?
  2. ¿Cómo se puede rellenar previamente la base de datos con datos? Tenga en cuenta que esta es una pregunta válida, independientemente de la respuesta a la parte 1: hay otros escenarios de uso para la población previa que un usuario administrador.

Para (1), parece que configurar el primer usuario desde dentro de la aplicación es un poco más de trabajo extra, por una funcionalidad que, por definición, casi nunca se usa. Sin embargo, puede ser un poco más seguro, ya que obliga al usuario a establecer una contraseña de su elección. La mejor solución es entre estos dos extremos: tener un script (o una tarea de rake, o lo que sea) para configurar el usuario inicial.El script se puede configurar para que se complete automáticamente con una contraseña predeterminada durante el desarrollo, y para solicitar que se ingrese una contraseña durante la instalación/implementación de producción (si desea desalentar una contraseña predeterminada para el administrador).

Para (2), parece que hay una serie de buenas soluciones válidas. Una tarea de rake parece una buena manera, y hay algunos complementos para hacer esto aún más fácil. Basta con mirar a través de alguna de las otras respuestas para ver los detalles de las personas :)

2

Lo mantendría en una migración. Si bien se recomienda utilizar el esquema para las configuraciones iniciales, la razón es que es más rápido, lo que evita problemas. Una sola migración extra para los datos debería estar bien.

También podría agregar los datos en el archivo de esquema, ya que es el mismo formato que las migraciones. Perderías la característica de autogeneración.

4

Supongo que la mejor opción es la número 3, principalmente porque de esa manera no habrá un usuario predeterminado, que es una gran manera de inutilizar la seguridad, que de otro modo sería buena.

3

Considere usar la consola de rieles. Bueno para tareas de administración puntuales en las que no vale la pena el esfuerzo de configurar un script o una migración.

En la máquina de producción:

script/console production 

... entonces ...

User.create(:name => "Whoever", :password => "whichever") 

Si se está generando este usuario inicial más de una vez, entonces usted podría también agregar una secuencia de comandos en RAILS_ROOT/script /, y ejecútelo desde la línea de comando en su máquina de producción, o mediante una tarea capistrano.

45

Pruebe una tarea de rake. Por ejemplo:

  1. Crear el archivo /lib/tasks/bootstrap.rake
  2. En el archivo, agregue una tarea de crear su usuario por defecto:

    namespace :bootstrap do 
     desc "Add the default user" 
     task :default_user => :environment do 
     User.create(:name => 'default', :password => 'password') 
     end 

     desc "Create the default comment" 
     task :default_comment => :environment do 
     Comment.create(:title => 'Title', :body => 'First post!') 
     end 

     desc "Run all bootstrapping tasks" 
     task :all => [:default_user, :default_comment] 
    end 
  1. Luego, cuando está configurando su aplicación por primera vez, puede hacer rake db: migrar O rake db: schema: load, y luego rake bootstrap: all.
+0

no funciona si/lib es RO, como si usted está en alojamiento compartido ambiente. ¿Tienes una solución que funcione en ese caso? – cbrulak

+9

Estoy bastante seguro de que está hablando sobre el directorio/lib de su aplicación. –

2

Para usuarios y grupos, la cuestión de los usuarios preexistentes debe definirse con respecto a las necesidades de la aplicación y no a las contingencias de la programación. Tal vez su aplicación requiera un administrador; luego prepoblar. O tal vez no, luego agregue el código para solicitar elegantemente una configuración de usuario en el momento del lanzamiento de la aplicación.

En la pregunta más general, está claro que muchas aplicaciones Rails se pueden beneficiar de una fecha precompilada. Por ejemplo, una solicitud de retención de dirección de EE. UU. También puede contener todos los Estados y sus abreviaturas. Para estos casos, las migraciones son su amigo, creo.

32

Recomiendo que no inserte ningún nuevo datos en las migraciones. En su lugar, solo modifique datos existentes en migraciones.

Para insertar datos iniciales, le recomendamos que use YML. En cada proyecto de Rails que configuro, creo un directorio de dispositivos en el directorio de DB. Luego creo archivos YML para los datos iniciales al igual que los archivos YML se utilizan para los datos de prueba. Luego agrego una nueva tarea para cargar los datos de los archivos YML.

lib/tareas/db.rake:

namespace :db do 
    desc "This loads the development data." 
    task :seed => :environment do 
    require 'active_record/fixtures' 
    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file| 
     base_name = File.basename(file, '.*') 
     say "Loading #{base_name}..." 
     Fixtures.create_fixtures('db/fixtures', base_name) 
    end 
    end 

    desc "This drops the db, builds the db, and seeds the data." 
    task :reseed => [:environment, 'db:reset', 'db:seed'] 
end 

db/accesorios/users.yml:

test: 
    customer_id: 1 
    name: "Test Guy" 
    email: "[email protected]" 
    hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12" 
    salt: "188227600.754087929365988" 
6

Pruebe el plugin seed-fu, que es un plugin bastante simple que le permite sembrar datos (y cambiar los datos semilla en el futuro), también le permitirá generar datos y datos específicos del entorno para todos los entornos.

3

Gran entrada en el blog sobre esto: http://railspikes.com/2008/2/1/loading-seed-data

que estaba usando sugerencias de Jay de un conjunto especial de accesorios, pero rápidamente me encontré creación de datos eso no sería posible usando los modelos directamente (entradas no versionadas cuando estaba usando acts_as_versioned)

31

Use db/seed.rb que se encuentran en todas las aplicaciones de Rails.

Si bien algunas de las respuestas dadas anteriormente desde pueden funcionar bien, están bastante desactualizadas y ya no son realmente convenciones de Rails.

La población de datos iniciales en la base de datos se debe hacer con el archivo db/seed.rb.

Funciona como un archivo Ruby.

Con el fin de crear y guardar un objeto, puede hacer algo como:

User.create(:username => "moot", :description => "king of /b/")

vez que tenga este archivo listo, puede hacerlo siguiendo

rake db:migrate

rake db:seed

O en un solo paso

rake db:setup

Su base de datos se debe rellenar con lo que los objetos que desea crear en seed.rb

+0

the db: seed lo hizo por mí. –

1

Algunas de las respuestas son obsoletas. Desde Rails 2.3.4, hay una característica simple llamado Semilla disponible en db/seed.rb:

#db/seed.rb 
User.create(:name => 'default', :password => 'password') 
Comment.create(:title => 'Title', :body => 'First post!') 

Proporciona una nueva tarea rastrillo que se puede utilizar después de sus migraciones para cargar datos:

rake db:seed 

Semilla. rb es un archivo clásico Ruby, no dude en utilizar cualquier estructura de datos clásica (array, hashes, etc.) y los iteradores para agregar sus datos:

["bryan", "bill", "tom"].each do |name| 
    User.create(:name => name, :password => "password") 
end 

Si desea agregar datos con caracteres UTF-8 (muy co mmon en francés, español, alemán, etc.), No se olvide de añadir al principio del archivo:

# ruby encoding: utf-8 

Este Railscast es una buena introducción: http://railscasts.com/episodes/179-seed-data

Cuestiones relacionadas