Railsユーザーがログインする必要があるアプリケーションがあります。したがって、アプリケーションを使用可能にするには、システムに最初のユーザーがログインするための初期ユーザーが1人必要です。 (その後、後続のユーザーを作成できます。)これまで、移行を使用してデータベースに特別なユーザーを追加しました。
この質問 を尋ねた後、移行を実行するのではなく、db:schema:loadを使用して、新しい開発マシンで新しいデータベースをセットアップする必要があるようです。残念ながら、これにはデータを挿入する移行は含まれていないようで、テーブルやキーなどをセットアップする移行のみが含まれています。
私の質問は、この状況に対処する最善の方法は何ですか:
私はこの質問に対して私が持っていた素晴らしい答えのいくつかを要約すると思いました、そして私は今、私はそれらすべてを読みました:)
ここには2つの明確な問題があります。
(1)の場合、アプリケーション自体から最初のユーザーを設定することは、定義上、ほとんど使用されない機能のために、かなり余分な作業であるようです。ただし、ユーザーが選択したパスワードを設定する必要があるため、わずかに安全性が高い場合があります。最適な解決策は、これらの2つの両極端の間にあります。最初のユーザーをセットアップするスクリプト(またはrakeタスクなど)を用意します。その後、開発中にデフォルトのパスワードを自動入力するようにスクリプトを設定し、本番インストール/デプロイメント中にパスワードの入力を要求することができます(管理者のデフォルトのパスワードを使用しない場合)。
(2)については、多くの適切で有効な解決策があるようです。レーキタスクは良い方法のように思えますが、これをさらに簡単にするプラグインがいくつかあります。他の回答のいくつかを見て、それらの詳細を確認してください:)
レーキタスクを試してください。例えば:
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
_db/seed.rb
_をすべてのRailsアプリケーションにあります。
2008の上記の回答の一部はうまく機能しますが、かなり時代遅れで、実際にはRailsの慣習ではありません。
データベースへの初期データの取り込みは、_db/seed.rb
_ファイルを使用して行う必要があります。
Rubyファイルのように機能します。
オブジェクトを作成して保存するには、次のようなことができます:
User.create(:username => "moot", :description => "king of /b/")
このファイルの準備ができたら、次のことができます
_rake db:migrate
_
_rake db:seed
_
またはワンステップで
_rake db:setup
_
Seed.rbで作成したいオブジェクトをデータベースに追加する必要があります
移行時にnewデータを挿入しないことをお勧めします。代わりに、移行では既存のデータのみを変更します。
初期データを挿入するには、YMLを使用することをお勧めします。設定するすべてのRailsプロジェクトで、DBディレクトリの下にフィクスチャディレクトリを作成します。テストデータにYMLファイルが使用されるように、初期データ用のYMLファイルを作成します。 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"
これは、populatorとfaker gemを使用した私の新しいお気に入りのソリューションです。
seed-f プラグインを試す。
最良のオプションは3番だと思います。これは主に、デフォルトのユーザーが存在しないためです。これは、そうでなければ優れたセキュリティを役に立たないようにする素晴らしい方法です。
Railsコンソールを使用することを検討してください。スクリプトまたは移行をセットアップする労力を払う価値がない1回限りの管理タスクに適しています。
生産マシンで:
script/console production
...そして...
User.create(:name => "Whoever", :password => "whichever")
この初期ユーザーを複数回生成している場合は、Rails_ROOT/script /にスクリプトを追加し、実動マシンのコマンドラインから、またはcapistranoタスクを介して実行することもできます。
これに関する素晴らしいブログ投稿: http://railspikes.com/2008/2/1/loading-seed-data
Jayの特別なフィクスチャセットの提案を使用していましたが、モデルを直接使用しては不可能なデータを作成していることにすぐに気付きました(acts_as_versionedを使用していたときのバージョン管理外のエントリ)
そのRakeタスクは、db-populateプラグインによって提供できます。
ユーザーとグループの場合、既存のユーザーの問題は、プログラミングの偶発性ではなく、アプリケーションのニーズに関して定義する必要があります。おそらくアプリには管理者が必要です。次に事前入力します。またはそうでないかもしれません-それからコードを追加して、アプリケーションの起動時にユーザー設定を適切に要求します。
より一般的な質問については、多くのRailsアプリが事前入力された日付から恩恵を受けることができることは明らかです。これらの場合、移行はあなたの友達です、と私は信じています。
移行を続けます。初期セットアップにはスキーマを使用することをお勧めしますが、その理由は、より高速であるため、問題を回避できるからです。データの追加の移行は1回で十分です。
移行と同じ形式であるため、スキーマファイルにデータを追加することもできます。自動生成機能が失われるだけです。
いくつかの答えは時代遅れです。 Rails 2.3.4であるため、Seedはdb/seed.rb
:
#db/seed.rb
User.create( :name => 'default', :password => 'password' )
Comment.create( :title => 'Title', :body => 'First post!' )
移行後にデータをロードするために使用できる新しいrakeタスクを提供します。
rake db:seed
Seed.rbは、クラシックなRubyファイルです。クラシックなデータ構造(配列、ハッシュなど)とイテレータを自由に使用してデータを追加できます。
["bryan", "bill", "tom"].each do |name|
User.create(:name => name, :password => "password")
end
UTF-8文字(フランス語、スペイン語、ドイツ語などで非常に一般的)を使用してデータを追加する場合は、ファイルの先頭に追加することを忘れないでください:
# Ruby encoding: utf-8
このRailscastは良い紹介です: http://railscasts.com/episodes/179-seed-data