Railsでデータベースからデータを受け取って表示する

開発環境は、Windows 7 Professional(32bit) + ruby 2.3.3p222 + Rails 4.2.1。

※下記のすべてのコマンド入力時は作ったアプリのディレクトリをカレントディレクトリに設定しておいてください。

■データベースを作る
railsでは最初に何も指定しなければSQliteを使うことになっている。
アプリを作成した段階でdbディレクトリ内にdevlopment.sqlite3test.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はシンプルに取得できる。

実行結果
f:id:k01ken:20180607201133p:plain


■フォームからデータベースに入れる

ビュー側の作成 - 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'

を追加。
これで、フォームからデータを入力して、データベースに入れることができます。