21
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Railsの基本

Last updated at Posted at 2018-12-10

◆アプリケーション開発の流れ

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作成

  1. マイグレーションファイルの作成
    $ rails g model Post content:text

  2. DBへの反映
    $ rails db:migrate

※変更されたマイグレーションファイルがDBに反映されていない状態で動かそうとすると、マイグレーションエラーが発生する。

・共通部品をまとめる

ヘッダー部分の「共通部品」については、application.html.erb にまとめる。
各ページ用に作成するビューは、<%= yield %> 部分に代入され表示される。

・~html.erb内で変数の使用方法

  • <% %>: 変数の定義などに利用(非表示)
  • <%= %>: 値の出力に使用

・cssファイル

下記フォルダのcss ファイルが使用される。
SampleApp/app/assets/stylesheets/home.scss

・画像の格納場所

画像ファイルは下記フォルダ配下に格納する。
SampleApp/public/

・リンクの貼り方

<%= %> の記述を利用して記述する。

application.html

<a href="/about"> About</a>
application.html.erb

<%= link_to("About", "/about") %>

※リンクの貼り方について、QA(補足等の提示は後日。。)
Q: link_toのカッコ()は無くても動作する?
A: 引数はカッコ()で囲まないでも動作する。

Q: 第二引数のスラッシュは必須?
A: スラッシュが無くても動作するが、あった方がよい。(Herokuに上げた際の動作を要確認)

・データのソート

コントローラー内でデータを取得する際、下記記載を行うことによりソート指定ができる。
@posts = Post.all.order(content: :desc)

  • contentをキーに降順

・変数params について

paramsの使い方は下記2パターンある。

①「:◯◯」を使った、ルーティングのURLから値を取得する。

route.rb

get "posts/:○○" => ....

②name属性が付いたフォームの入力内容を受け取る。

~.html.erb

<textarea name="○○"></textarea>
21
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?