◆アプリケーション開発の流れ
Twitterのような文字列の投稿、閲覧機能を有する「Sample_App」アプリケーションの構築を行う流れについて、簡単に整理。
・環境面の設定など
$ rails new Sample_App
Railsアプリケーションの準備。
開発に必要なフォルダ、ファイル等を自動で作成する。
(app, config, db フォルダ等)
$ rails server
サーバーの立ち上げコマンド。
成功すると
URL: localhost:3000 に接続し、「Yay! You're on Rails!」 の画面が表示される。
・topページの構築
$ rails generate controller home top
- home: コントローラー名
- top: アクション名
webページ(/home/top) が作成される。
※併せて、home.scss も作成される。
・投稿一覧ページの構築
$ rails generate controller posts index
- posts: コントローラー名
- index: アクション名
post用のコントローラー等が作成される。
(route, controller, view が自動作成される)
(データベース関連)
$ rails g model Post content:text
- g: (=generate)
- Post: モデル名(単数形にする)
- content: カラム名
- text: データ型
下記フォルダにマイグレーションファイルを作成する。
Sample_App/db/migrate/
$ rails db:migrate
作成(変更)されたマイグレーションファイルをデータベースに反映させる。
・投稿詳細ページの構築
- [ルーティング]
get "posts/:id" => "posts#show"
※注:「index」 用のルーティングより下に記述する必要あり。
- [コントローラー]
def show
@post = Post.find_by(id: params[:id])
end
一覧画面で選択されたデータのidを指定(params[:id])して取得したデータを@postに格納する。
- [ビュー]
<%= link_to(post.content, "/posts/#{post.id}") %>
showアクションにid情報を渡すための記述を加える。
・新規投稿ページの構築①(ページ遷移)
- [ルーティング]
get "posts/new" => "posts#new"
新規投稿ページへの遷移用。
- [コントローラー]
def new
end
- [ビュー]
<textarea></textarea>
<input type="submit" value="投稿">
入力フォーム(入力欄)と、投稿ボタンを設置。
・新規投稿ページの構築②(createアクション:データ保存)
- [ルーティング]
post "posts/create" => "posts#create"
- [コントローラー]
def create
redirect_to("/posts/index")
end
データ保存処理後に、投稿一覧ページに遷移させる。(リダイレクト)
- [ビュー]
<%= form_tag("/posts/create") do %>
.....
<% end %>
- "/posts/create": フォームの送信先を指定
- <% %> ではく、<%= %> である点に注意
Q: form_tag におけるdo とは(要確認)
(データ保存: createアクションの続き)
ここまで修正を行った上で、「投稿の保存」を行うためには更に修正が必要となる。
①投稿をcreateアクションに送信する。
- [ビュー]
<textarea name="content"></textarea>
<input type="submit" value="投稿">
textareaにname属性を指定。
※name属性をキーとしたハッシュがRails側に送られる。
②送信された内容を取得し、データベースに保存する。
- [コントローラー]
def create
@post = Post.new(content: params[:content]) #paramsで取得した情報でインスタンスを作成
@post.save #データベースに保存
redirect_to("/posts/index")
end
◆その他
・ルーティングにつて
URL | コントローラ | アクション | route.rb の記述 |
---|---|---|---|
home/top | home | top | get "/" => "home#top" |
home/about | home | about | get "about" => "home#about" |
・table作成
-
マイグレーションファイルの作成
$ rails g model Post content:text
-
DBへの反映
$ rails db:migrate
※変更されたマイグレーションファイルがDBに反映されていない状態で動かそうとすると、マイグレーションエラーが発生する。
・共通部品をまとめる
ヘッダー部分の「共通部品」については、application.html.erb にまとめる。
各ページ用に作成するビューは、<%= yield %> 部分に代入され表示される。
・~html.erb内で変数の使用方法
- <% %>: 変数の定義などに利用(非表示)
- <%= %>: 値の出力に使用
・cssファイル
下記フォルダのcss ファイルが使用される。
SampleApp/app/assets/stylesheets/home.scss
・画像の格納場所
画像ファイルは下記フォルダ配下に格納する。
SampleApp/public/
・リンクの貼り方
<%= %> の記述を利用して記述する。
<a href="/about"> About</a>
<%= link_to("About", "/about") %>
※リンクの貼り方について、QA(補足等の提示は後日。。)
Q: link_toのカッコ()は無くても動作する?
A: 引数はカッコ()で囲まないでも動作する。
Q: 第二引数のスラッシュは必須?
A: スラッシュが無くても動作するが、あった方がよい。(Herokuに上げた際の動作を要確認)
・データのソート
コントローラー内でデータを取得する際、下記記載を行うことによりソート指定ができる。
@posts = Post.all.order(content: :desc)
- contentをキーに降順
・変数params について
paramsの使い方は下記2パターンある。
①「:◯◯」を使った、ルーティングのURLから値を取得する。
get "posts/:○○" => ....
②name属性が付いたフォームの入力内容を受け取る。
<textarea name="○○"></textarea>