Railsでデータベースからデータを受け取って表示する
開発環境は、Windows 7 Professional(32bit) + ruby 2.3.3p222 + Rails 4.2.1。
※下記のすべてのコマンド入力時は作ったアプリのディレクトリをカレントディレクトリに設定しておいてください。
■データベースを作る
・railsでは最初に何も指定しなければSQliteを使うことになっている。
アプリを作成した段階でdbディレクトリ内にdevlopment.sqlite3とtest.sqlite3が自動的に作成されている。
・データベースの設定はconfig/database.ymlに書いてある。
・development(開発),test(テスト),production(本番)の3つのモードに分かれている。
・アプリのルート部分をカレントディレクトリにすると、
rake db:create
既に作られているのでここは、飛ばして良い。
データベースを削除する場合は、
rake db:drop
を入力する。
■モデルを作る
モデルは下記のようなコマンドで作成することができます。
rails generate model モデル名 rails generate model モデル名 フィールド名1:データ型1...
今回は
rails generate post
と入力します。すると、app/models/ディレクトリ内にpost.rbが作成されています。
■テーブルを作る
・モデルを作成した段階で、db/migrateディレクトリ内にマイグレーションスクリプトというファイルが作成されています。このファイルを利用することで、コマンド上からテーブルを作成することができます。
カラムのデータ型として指定可能なものは以下のサイトが参考になります。
モデルの作成とRailsで指定可能なデータ型 - Ruby on Rails入門
今回は、create_tableブロック内に以下のコードを追加。改行ごとにカンマはいりません。
t.string :name t.text :description
次に
rake db:migrate
と入力することでpostsテーブルが作成されています。
次に、作ったテーブルにデータを入れてみます。
dbディレクトリにseeds.rbが作成されているので、
6.times{ Post.create(:name => '太郎', :description => 'こんにちは。投稿になります。') }
同じデータを6個入れてみます。実行は、
rake db:seed
これでデータが入ります。
■データベースからデータを受け取る
呼び出したいコントローラ(今回はtop_controller.rb)に以下のメソッドを追加する。
def hello @posts = Post.all end
config/routes.rbに、
get 'hello' => 'top#hello'
app/views/topディレクトリにhello.html.erbという名前で以下のコードを追加する。
<% @posts.each do |item| %> 名前 <%= item.name %>, 投稿 <%= item.description %><br /> <% end %>
サーバーを
rails server
で立ち上げて、localhost:3000/helloへアクセスすると成功。CakePHPと違ってモデルと同じ名前のコントローラじゃなくても問題なく読み出せる。
CakePHPの場合は、TableRegistry::getでテーブル名を取得しないといけないが、Railsはシンプルに取得できる。
実行結果
■フォームからデータベースに入れる
ビュー側の作成 - app/views/top/index.html.erb
<%= form_tag("/add", :method => "post") do %> <%= text_field_tag(:name) %> <%= text_field_tag(:description) %> <%= submit_tag("投稿") %> <% end %>
コントローラ側に追加 - app/controllers/top_controllers.rb
def index end def add @post = Post.new(name: params[:name], description: params[:description]) if @post.save redirect_to "/hello" else redirect_to "/index" end end
config/route.rbにて、
root 'top#index' post 'add' => 'top#add'
を追加。
これで、フォームからデータを入力して、データベースに入れることができます。