【Ruby on Rails】簡単なメモアプリの作成|シンプルなデザインに画像を表示したトップページを作成

作成日: 更新日:

開発環境

  • Ruby:version 3.1.2
  • Ruby on Rails:version 7.0.4
  • Visual Studio Code:version 1.73.0
  • OS:Windows10

Ruby on Railsでトップページの作成手順

Ruby on RailsでWebアプリケーションを作成するうえで欠かせないのが、ユーザーが一番最初にみるトップページです。 今回はメモアプリの作成で使用した「トップページの作成」のコードを用いて解説していきます。

トップページのコントローラーの作成

まずはトップページのコントローラーを作成していきます。

1rails g controller homes

Ruby on Railsでトップページのコントローラ名は「homes」とされることが多いため、今回の実装でもコントローラー名は「homes」としています。

1# memo_app\app\controllers\homes_controller.rb
2class HomesController < ApplicationController
3    before_action :logged_in?, only: [:top]
4
5    def top
6    end
7
8end

トップページ用のtopアクションを追加しておき、before_actionでログインしている状態かを確認するメソッドが実行されるように記述しておきます。 このあたりの仕様はWebアプリケーションによって調整しましょう。

トップページのルーティングの作成

次にトップページのルーティングを作成していきます。

1# memo_app\config\routes.rb
2Rails.application.routes.draw do
3+   root :to => 'homes#top'
4  resource :users, only: [:new, :show, :edit, :create, :update]

前回までは「root :to => 'memos#index'」としていましたが、今回はトップページを作成したので「root :to => 'homes#top'」へ変更しています。 トップページを変更したい場合は、ルーティングの「root :to => 'コントローラー名#アクション名'」を変更しましょう。

トップページの画像を準備する

次にトップページの画像を準備します。 今回は「memo_app\app\assets\images」フォルダ内に「mv.jpg」というファイル名でファイルを追加しています。 画像保存場所については、ユーザーがファイルを投稿して表示するような場合は「memo_app\public」に保存されるような処理が推奨されています。 今回はアプリケーション側で事前に準備している画像なので「memo_app\app\assets\images」フォルダ内に保存しています。

トップページのビューとレイアウトの作成

次にトップページのビューとレイアウトを作成します。

1# memo_app\app\views\homes\top.html.erb
2<div class="wrapper">
3    <div class="container mv-image">
4        <div class="mv-imag-transparent">
5            <div class="top-container">
6               <div class="col-box-1">
7                    <h2>ようこそMemoAppへ!</h2>
8                </div>
9                <div class="col-box-1">
10                    <p>MemoAppは、無料で利用できるメモアプリです。</p>
11                    <br>
12                    <p>いつでも、どこでも、思いついたらすぐに記録することができるシンプルな機能を提供しています。</p>
13                    <br>
14                    <p>ぜひ、ご活用ください。</p>
15                </div>
16                <div class="col-box-1">
17                    <%= link_to "新規登録", new_users_path, method: :get, class: "btn-100 green-color" %>
18                    <%= link_to "ログイン", new_sessions_path, method: :get, class: "btn-100 blue-color" %>
19                </div>
20            </div>
21        </div>
22    </div>
23</div>

CSSのclassについては事項でご紹介します。 ポイントとしてはメインビジュアルに背景画像を使用するため、containerの中に背景画像を指定している形です。 その後のレイアウトとしては背景画像を透過するためのレイアウト「mv-imag-transparent」、その中にテキストを表示するためのレイアウト「top-container」という構成にしているところです。

1# memo_app\app\views\layouts\application.html.erb
2
3  <body>
4    <div class="wrapper header-color">
5      <div class="container flex-between">
6        <div class="header-left">
7+           <h1><%= link_to "MemoApp", root_path, method: :get %></h1>
8        </div>
9
10        <div class="header-right">
11          <% if @current_user.nil? %>
12            <%= link_to "新規登録", new_users_path, method: :get %>
13            <%= link_to "ログイン", new_sessions_path, method: :get %>
14          <% else %>
15            ログインユーザー:<%= @current_user.name %>さん
16            <%= link_to "登録情報", users_path, method: :get %>
17            <%= link_to "ログアウト", destroy_sessions_path, method: :delete %>
18          <% end %>
19        </div>
20      </div>
21    </div>

また、ヘッダーのロゴにあたる部分もリンクになるように調整しておきましょう。

トップページのデザインの調整

次にトップページのデザインの調整をしていきます。

1# memo_app\app\assets\stylesheets\application.css
2
3 * {
4    padding: 0;
5    margin: 0;
6    box-sizing: border-box;
7    color: #696969;
8    font-size: 16px;
9    font-family: sans-serif;
10    list-style-position: inside;
11}
12
13+ /* トップページ用のCSS */
14+ 
15+ .mv-image {
16+     background-image: url("mv.jpg");
17+     background-position: center;
18+     background-size: cover;
19+     height: 600px;
20+ }
21+ 
22+ .mv-imag-transparent{
23+     background-color: rgba(255, 255, 255, 0.4);
24+     width: 100%;
25+     height: 100%;
26+ }
27+ 
28+ .top-container {
29+     margin: 0 auto;
30+     width: 100%;
31+     max-width: 760px;
32+ }
33+ 
34+ 
35/* ヘッダー用のCSS */
36.header-color {
37    background-color: #4169e1;
38}
39
40.header-left {
41    color: #ffffff;
42    display: inline-block;
43    line-height: 60px;
44}
45.header-left a{
46    text-decoration: none;
47    color: inherit;
48    font-size: 36px;
49}
50
51.header-right {
52    color: #ffffff;
53    display: inline-block;
54    line-height: 60px;
55}
56.header-right a{
57    text-decoration: none;
58    color: inherit;
59}
60
61
62.green-color{
63    background-color: green;
64}
65
66+ .blue-color{
67+     background-color: blue;
68+ }
69
70.red-color{
71    background-color: red;
72}
73
74.notice-text {
75    color: #ffffff;
76    font-weight: bold;
77    text-align: center;
78    padding: 10px 0;
79}
80
81h1 {
82    font-size: 36px;
83    color: #ffffff;
84}
85
86h2 {
87    font-size: 24px;
88}
89
90h3 {
91    font-size: 24px;
92}
93
94.wrapper {
95    width: 100%;
96}
97
98.container {
99    margin: 0 auto;
100    width: 100%;
101    max-width: 1170px;
102}
103
104.col-box-1{
105    width: 100%;
106    padding: 6px;
107}
108
109.col-box-2{
110    width: 50%;
111    padding: 6px;
112}
113
114.col-box-3{
115    width: 33.3%;
116    padding: 6px;
117}
118
119.col-box-4{
120    width: 25%;
121    padding: 6px;
122}
123
124.flex-start {
125    display: flex;
126    flex-wrap: wrap;
127    justify-content: start;
128}
129
130.flex-between {
131    display: flex;
132    flex-wrap: wrap;
133    justify-content: space-between;
134}
135
136
137.memo-header {
138    width: 100%;
139    padding: 6px;
140    min-height: 40px;
141    background-color: #ffd700;
142    border-radius: 6px 6px 0 0;
143}
144
145.memo-center {
146    width: 100%;
147    padding: 6px;
148    min-height: 100px;
149    background-color: #fffacd;
150}
151
152.memo-footer {
153    width: 100%;
154    padding: 6px;
155    background-color: #ffd700;
156    border-radius: 0 0 6px 6px;
157    text-align: center;
158}
159
160.memo-other {
161    width: 100%;
162    padding: 6px;
163    text-align: right;
164}
165
166.form-box {
167    background-color: transparent;
168    border: 1px solid #d3d3d3;
169    border-radius: 6px;
170    padding: 6px;
171    width: 100%;
172}
173
174.search-box {
175    background-color: transparent;
176    border: 1px solid #d3d3d3;
177    border-radius: 6px;
178    padding: 6px;
179    width: 30%;
180}
181
182textarea {
183    min-height: 80px;
184}
185
186.btn {
187    border: 1px solid #d3d3d3;
188    border-radius: 6px;
189    padding: 3px 12px;
190}
191
192+ .btn-100 {
193+     color: #ffffff;
194+     border-radius: 6px;
195+     padding: 12px 12px;
196+     display: inline-block;
197+     width: 100%;
198+     font-size: 1.2em;
199+     text-align: center;
200+     text-decoration: none;
201+     margin: 10px 0;
202+ }
203
204
205.field_with_errors {
206    display: contents;
207}

今回は「memo_app\app\assets\images」フォルダ内に画像をファイルを保存しているため、「background-image: url("mv.jpg");」で画像のURLを指定しています。 画像を保存する場所によって画像ファイルのURLは異なるため、画像の保存場所によって適切なURLを読むこむようにしておかないと画像が表示されないということになる点は注意が必要です。

メモコントローラーのリダイレクト先を修正

最後にメモコントローラーのリダイレクト先を修正しておきます。

1# memo_app\app\controllers\memos_controller.rb
2
3  def create
4    @memo_new = Memo.new(memos_params)
5    @memos = Memo.all
6    if @memo_new.save
7+       redirect_to memos_path
8    else
9      render action: "index"
10    end
11  end
12
13  def update
14    @memo = Memo.find(params[:id])
15    @memo.update(memos_params)
16+     redirect_to memos_path
17  end
18
19  def destroy
20    @memo = Memo.find(params[:id])
21    @memo.destroy
22+     redirect_to memos_path
23  end

今回、トップページを作成したので、メモの作成、メモの更新、メモの削除で指定していたリダイレクト先も整えておきます。

おわりに

Ruby on Railsでトップページの作成について解説してきましたが、いかがだったでしょうか。 ユーザーがどのようなWebサービスなのかを理解しやすくするためにも、Webアプリケーションだけに限らずトップページの作成は重要なページとなります。 是非、トップページだけに限らずユーザーにとって有益な情報となるページの作成に挑戦してみてください。

【Ruby on Rails】簡単なメモアプリの作成|シンプルなデザインに画像を表示したトップページを作成 | いっしー@Webエンジニア