Rails でスキャフォールドを生成することとモデルを生成することの違いは何ですか? どちらを実行する場合の利点と欠点は何ですか?
ベストアンサー1
モデルを生成すると、モデルといくつかの関連コンポーネントが取得されます。このようなトピックを説明するときに私がよく使う方法の 1 つは、実際に試してみるか、他の人に試してみるように勧めることです。そのため、rails generate model Foo name:string description:text
Rails プロジェクト内でコマンドを入力すると、次のようになります。
invoke active_record
create db/migrate/20130719012107_create_foos.rb
create app/models/foo.rb
invoke test_unit
create test/unit/foo_test.rb
create test/fixtures/foos.yml
最初の行は を呼び出しますActive Record
。これは基本的にモデルをデータベースに結び付けます。次の行は移行ファイルと呼ばれるものを作成します。移行ファイルには、データベースを変更するための指示が含まれています。この最初の移行ファイルは、「foos」というデータベース テーブルを作成し、「name」と「description」の列も作成します。
次の行はモデル自体を作成します。モデルは基本的に Active Record から継承された Ruby クラスです。つまり、Active Record で呼び出せるメソッドはすべてモデルで呼び出せるようになります。最後の 3 行は基本的にモデルに関連するテスト ファイルを作成します。RSpec を使用している場合は、代わりに spec ファイルが作成されます。
Rails アプリケーションにモデルしか含まれていない場合、ページに情報を表示するビューや、情報の流れを制御する命令は存在しません。選択肢は、コントローラも生成する (これによりビューも生成されます) か、スキャフォールドを生成する (これによりモデル、ビュー、コントローラが生成され、routes.rb ファイルに書き込まれる) かです。実行すると、次のようrails generate scaffold foo
になります。
invoke active_record
create db/migrate/20130719013307_create_foos.rb
create app/models/foo.rb
invoke test_unit
create test/unit/foo_test.rb
create test/fixtures/foos.yml
invoke resource_route
route resources :foos
invoke scaffold_controller
create app/controllers/foos_controller.rb
invoke erb
create app/views/foos
create app/views/foos/index.html.erb
create app/views/foos/edit.html.erb
create app/views/foos/show.html.erb
create app/views/foos/new.html.erb
create app/views/foos/_form.html.erb
invoke test_unit
create test/functional/foos_controller_test.rb
invoke helper
create app/helpers/foos_helper.rb
invoke test_unit
create test/unit/helpers/foos_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/foos.js.coffee
invoke scss
create app/assets/stylesheets/foos.css.scss
invoke scss
identical app/assets/stylesheets/scaffolds.css.scss
ご質問にお答えすると、スキャフォールドの利点は、迅速で簡単で、すべてが事前に構成されていることです。ただし、スキャフォールドとは独立してモデルを生成すること (そして次に必要に応じてコントローラー/ビューを生成し、routes.rb ファイルを自分で記述すること) の利点は、アプリとその外観や機能をより細かく制御できること、不要なコードを避けることができること、ビヘイビア駆動開発やテスト駆動開発を採用できること、そしておそらく他の誰かが追加したいと思われるその他の機能も使用できることです。
最後にアドバイスを一つ。Rails は非常にユーザーフレンドリーなので、自分で実験してみてください。generate
対応するコマンドを使用してdestroy
、任意のコマンドを取り消すことができます。たとえば、rails destroy scaffold Foo
は によって生成されたすべてのファイルを削除しますrails generate Scaffold Foo name:string description:string
。そのため、実験によってプロジェクトが取り返しのつかないほど台無しになる心配はありません。