Tengo una aplicación Rails 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 que la primera persona inicie sesión (luego pueden crear usuarios posteriores). Hasta ahora he usado una migración para agregar un usuario especial a la base de datos.
Después de preguntar esta pregunta , parece que debería usar db: schema: load, 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, solo aquellas que configuran tablas, claves, etc.
Mi pregunta es, ¿cuál es la mejor manera de manejar esta situación:
Pensé que resumiría algunas de las grandes respuestas que he tenido a esta pregunta, junto con mis propios pensamientos, ahora los he leído todos :)
Hay dos cuestiones distintas aquí:
Para (1), parece que configurar el primer usuario desde la propia aplicación es un poco de trabajo adicional, para 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. La secuencia de comandos se puede configurar para que se rellene automáticamente con una contraseña predeterminada durante el desarrollo y para que se ingrese una contraseña durante la instalación/implementación de la producción (si desea evitar una contraseña predeterminada para el administrador).
Para (2), parece que hay una serie de soluciones buenas y válidas. Una tarea de comisión parece una buena manera, y hay algunos complementos para hacer esto aún más fácil. Solo mire algunas de las otras respuestas para ver los detalles de esas :)
Intenta una tarea de rastrillo. Por ejemplo:
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
Use db/seed.rb
encontrado en cada aplicación de Rails.
Si bien algunas respuestas dadas anteriormente de 2008 pueden funcionar bien, están bastante desactualizadas y ya no son realmente la convención de Rails.
El llenado de los datos iniciales en la base de datos debe hacerse con el archivo db/seed.rb
.
Simplemente funciona como un archivo de Ruby.
Para crear y guardar un objeto, puedes hacer algo como:
User.create(:username => "moot", :description => "king of /b/")
Una vez que tenga este archivo listo, puede hacer lo siguiente
rake db:migrate
rake db:seed
O en un paso
rake db:setup
Su base de datos debe rellenarse con los objetos que desea crear en seed.rb
Recomiendo que no inserte ningún nuevo datos en las migraciones. En su lugar, solo modifique los datos existentes en las migraciones.
Para insertar datos iniciales, te recomiendo que uses YML. En cada proyecto de Rails que instalo, creo un directorio de dispositivos en el directorio DB. Luego creo archivos YML para los datos iniciales, al igual que los archivos YML se usan para los datos de prueba. Luego agrego una nueva tarea para cargar los datos de los archivos YML.
lib/tasks/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/fixtures/users.yml:
test:
customer_id: 1
name: "Test Guy"
email: "[email protected]"
hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
salt: "188227600.754087929365988"
Esta es mi nueva solución favorita, usando el populador y las gemas falsas:
Pruebe el seed-f plugin, que es un complemento bastante simple que le permite generar datos (y cambiarlos en el futuro), también le permitirá recopilar datos y datos específicos del entorno para todos los entornos. .
Supongo que la mejor opción es la número 3, principalmente porque de esa manera no habrá un usuario predeterminado, lo cual es una excelente manera de hacer que la buena seguridad sea inútil.
Considere usar la consola Rails. Ideal para tareas de administración únicas en las que no vale la pena configurar un script o migración.
En su máquina de producción:
script/console production
... entonces ...
User.create(:name => "Whoever", :password => "whichever")
Si está generando este usuario inicial más de una vez, también puede agregar un script en Rails_ROOT/script /, y ejecutarlo desde la línea de comandos en su máquina de producción, o mediante una tarea de capistrano.
Gran publicación del blog sobre esto: http://railspikes.com/2008/2/1/loading-seed-data
Estaba usando las sugerencias de Jay de un conjunto especial de accesorios, pero rápidamente me encontré creando datos que no serían posibles usando los modelos directamente (entradas no versionadas cuando estaba usando act_as_versioned)
Esa tarea de Rake puede ser proporcionada por el complemento db-populate:
Para usuarios y grupos, la cuestión de los usuarios preexistentes debe definirse con respecto a las necesidades de la aplicación en lugar de las contingencias de la programación. Tal vez su aplicación requiere un administrador; entonces prepopular. O tal vez no, a continuación, agregue el código para solicitar la configuración de un usuario al momento de iniciar la aplicación.
En la pregunta más general, está claro que muchas aplicaciones de Rails pueden beneficiarse de una fecha previamente completada. Por ejemplo, una solicitud de retención de direcciones en los Estados Unidos también puede contener todos los estados y sus abreviaturas. Para estos casos, las migraciones son tu amigo, creo.
Lo mantendría en una migración. Si bien se recomienda usar el esquema para las configuraciones iniciales, la razón es que es más rápido, evitando así problemas. Una sola migración adicional para los datos debería estar bien.
También puede agregar los datos en el archivo de esquema, ya que es el mismo formato que las migraciones. Acabarías de perder la característica de generación automática.
Algunas de las respuestas están desactualizadas. Desde Rails 2.3.4, hay una característica simple llamada Seed 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 de rake que puede usar después de las migraciones para cargar datos:
rake db:seed
Seed.rb es un archivo clásico de Ruby, siéntase libre de usar cualquier estructura de datos clásica (matriz, hashes, etc.) e 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 comunes en francés, español, alemán, etc.), no se olvide de agregar al principio del archivo:
# Ruby encoding: utf-8
Este Railscast es una buena introducción: http://railscasts.com/episodes/179-seed-data