2016年9月7日
協力 未来会議室
- 村上 卓
- 29歳
- フリーランス
- AngularJS/Ruby On Rails
- 概念的な説明はしません(MVC、CoC、DRY...)
- とにかく書いて動かしてもらいます
- Webアプリケーションを作成するための
フレームワーク(OSS) - プログラミング言語Rubyを使用
RoR、Railsとよく省略して表記されます
Note: DHH(デイヴィッド・ハイネマイヤー・ハンソン (David Heinemeier Hansson))デンマーク
- Cookpad
- 食べログ
- Hulu
- Airbnb
- クラウド開発環境
- ブラウザでIDEが利用可能
- Create a new workspaceを選択
- Workspace nameに「rails-tutorial」と入力
- Choose a templateで「Ruby」を選択
- Clone from Git or Mercurial URLに下記URLを追加
- URLを入れることで前回のソースをダウンロードしてきます
https://github.com/sugumura/ror-first-tutorial
コマンドラインで実行
Rialsで利用するライブラリの更新
$ bundle install
データベースの作成・更新
$ ./bin/rake db:migrate
- 「Run Project」を押す
- 「Preview」を押す
- 「Preview Runnning Application」ボタンを押す
- 記事の作成
- 記事の表示
- 記事の一覧
削除ボタンを追加
ファイルツリーでindex.html.erbを開く
app/views/articles/index.html.erb
<tr>
<th>Title</th>
<th>Body</th>
<th>Delete</th>
</tr>
<% @articles.each do |article| %>
<tr>
<td><%= link_to article.title, article %></td>
<td><%= article.body %></td>
<td><%= link_to 'Delete', article_path(article),
method: :delete %></td>
</tr>
<% end %>
削除ボタンを押す
コントローラーにdestroyアクションを追加
app/controllers/articles_controller.rb
def create
...
end
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end
Destroyボタンを押すと記事が削除されて一覧に戻ります
機能 | URL | アクション | ビュー |
---|---|---|---|
一覧 | /articles/ | index | index.html.erb |
作成 | /articles | create | |
詳細 | /articles/1 | show | show.html.erb |
削除 | /articles/1 | destroy |
- 他に編集(edit)と更新(update)があります
記事ごとにコメントをつけられるようにしましょう
- コメントは1つの記事(Article)に追加されます
- コメントは記事に対して複数できます
1つの記事に対して複数のコメントが紐づく
こういった関係を 一対多 の関係といいます
モデル名: Comment
$ ./bin/rails g model Comment commenter:string body:text article:references
Running via Spring preloader in process 8000
invoke active_record
create db/migrate/20160907085827_create_comments.rb
create app/models/comment.rb
invoke test_unit
create test/models/comment_test.rb
create test/fixtures/comments.yml
マイグレーションを行うことで
データベースにCommentsテーブルを作成
$ ./bin/rake db:migrate
Running via Spring preloader in process 8012
== 20160907085827 CreateComments: migrating ==
-- create_table(:comments)
-> 0.0031s
== 20160907085827 CreateComments: migrated (0.0032s) ==
$ sqlite3 db/development.sqlite3
sqlite> .table
articles comments schema_migrations
sqlite> .schema comments
CREATE TABLE "comments" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"commenter" varchar,
"body" text,
"article_id" integer,
"created_at" datetime NOT NULL,
"updated_at" datetime NOT NULL
);
CREATE INDEX "index_comments_on_article_id"
ON "comments" ("article_id");
belongs_to
でArticleモデルに関連指定
app/models/comment.rb
class Comment < ActiveRecord::Base
belongs_to :article
end
Articleモデルに関連指定を追加
app/models/article.rb
class Article < ActiveRecord::Base
has_many :comments
end
コメントモデルを扱うためにルーティングを設定
config/routes.rb
root 'welcome#index'
resources :articles do
resources :comments
end
$ ./bin/rails g controller Comments
create app/controllers/comments_controller.rb
invoke erb
create app/views/comments
invoke test_unit
create test/controllers/comments_controller_test.rb
invoke helper
create app/helpers/comments_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/comments.coffee
invoke scss
create app/assets/stylesheets/comments.scss
Backリンクの前に追加
app/views/articles/show.html.erb
<h2>Add a comment:</h2>
<%= form_for([@article, @article.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br>
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<%= link_to 'Back', articles_path %>
Create Commentボタンを押す
app/controllers/comments_controller.rb
class CommentsController < ApplicationController
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.create(comment_params)
redirect_to article_path(@article)
end
private
def comment_params
params.require(:comment).permit(:commenter, :body)
end
end
CommenterとBodyに値を入れて「Create Comment」
- インプットボックスの値が空になる
- コメントは保存されたが表示されていない
コメント入力の前に追加
app/views/articles/show.html.erb
<h2>Comments</h2>
<% @article.comments.each do |comment| %>
<p>
<strong>Commenter:</strong>
<%= comment.commenter %>
</p>
<p>
<strong>Comment:</strong>
<%= comment.body %>
</p>
<% end %>
実は公式のGetting Started ぜひ続きを試してください