【Ruby on Rails】ルーティング、マイグレーション云々【学習記録1】
2013.10.15
最近ようやく少しずつRailsに乗りこなせるになってきたので、ちょっと整理がてらリソースベースのルーティングやらマイグレーションやらの整理をしてみる。
つくるもの
シードデータやらルーティングやらマイグレーションやらいじりつつブログ記事っぽい感じで DBからの簡単な読み出し。それだけ。「Scaffoldでやれば」って話だけど、根幹の仕組みは知っておきたいので。
データの用意
何はともあれmodelの作成。コンソール上で以下のコマンド。
rails g model article
マイグレーション用のスクリプトができたはずなので、db/migrate に移動し スクリプトを編集。
class CreateArticles < ActiveRecord::Migration def change create_table :articles do |t| t.text :title t.text :body t.date :created_at t.date :expired_at t.boolean :is_public t.timestamps end end end
マイグレーションの実行。
rake db:migrate
一個一個データぶっ込むのも面倒なので、シードデータをつくる。
k = ["猫","えんぴつ","麦茶","ホットコーヒー","アルコール","パソコン","IT系クラスタ"] m = ["不自然な挙動","王子様","バグ","酸化","勉強会"] 10.times do Article.create( title: k[rand(k.length)] + "の" + m[rand(m.length)] + "に関する考察", body: "いくらシードデータだからとはいえ変なものばっかり載せるわけにもいかんだろうし>、ちょっとここらでLorem ipsum dolor sit amet でもしますか。", created_at: 1.day.ago, expired_at: 10.days.from_now, ) end
こんな感じでタイトルは二個の配列からランダムに要素を取ってきて組み合わせてつくる感じにした。本文は適当。というわけでシードデータをぶっ込む。
rake db:seed
“Can’t mass-assign protected attributes: title, body, created_at, expired_at” と言われて拒否られる。そういえばmodelの方にattr_accessible書き忘れてた。というわけで、app/models/articles.rb のクラス内に以下のスクリプトを挿入。
attr_accessible :title, :body, :created_at, :expired_at
再び上記のコマンドでシードデータをぶっ込む。よし、通った。
因みにここら辺は db:seed の代わりに db:reset を使ってあげても良い。
ルーティング 及び コントローラの作成
まずはコントローラをつくる。コンソール上で以下のコマンドを実行。
rails g controller article
コントローラができた。app/controllers/article.rb を以下のように記述。今回はRESTfulな感じでリソースベースのルーティングをするので 7つのactionを用意。今回の記事に関しては とりあえず index と show だけやることにする。
class ArticlesController < ApplicationController def index @articles = Article.order end def show @article = Article.find(params[:id]) end def edit end def destroy end def new end def update end def create end end
同時にconfig/routes.rbに以下の記述を追加。
resources :articles do end
これで7つのアクションに対応した。
Viewの作成
コンソールでコントローラ生成した時に viewファイル用のフォルダもできてるので、app/views/articles/ に移動して index.html.erb と show.html.erb の作成。
index.html.erb
<% @page_title = "ARTICLES" %> <h2><%= @page_title %></h2> <% @articles.each do |article| %> <h3><%= link_to article.title, article %> <%= article.created_at.strftime("(%Y.%m.%d)") %></h3> <p><%= article.body %></p> <% end %> <%= link_to "戻る", :root %>
show.html.erb
<% @page_title = @article.title %> <h2><%= @article.title + @article.created_at.strftime(" (%Y.%m.%d)") %></h2> <p><%= @article.body %></p> <p><%= link_to "戻る", :articles %></p>
こんな感じで(因みにテンプレートファイルに関しては別途 app/views/layouts/application.html.erb に記述してある)。
indexのViewはこんな感じに仕上がった。
うーん、タイトルがひどい。何はともあれうまくデータ引っ張ってきてるから良しとする。
showの方はこんな感じ。
URIも /articles/5 みたいな感じで シンプルでいいね。
という感じで学習の振り返りしてみました。最初のうちは色々概念が登場しまくって頭がこんがらがりそうでしたが、何度か写経したりエラーと奮闘しているうちに ようやくRailsのスタートラインって感じ。
とはいえ、まだまだ扱いこなせていないので、もう少し勉強して 改めてこの場で報告させていただくことにします。
Written by Nisei Kimura ( 木村 仁星 )